GUPNet icon indicating copy to clipboard operation
GUPNet copied to clipboard

Calibration.flip()函数的原理

Open kwong292521 opened this issue 3 years ago • 4 comments

作者你好,在数据增强的水平翻转操作中,若图像进行了翻转,那么相机的相关标定信息会发生变化。在您的代码中体现在kitti.py中的calib.flip(img_size)这一操作,但是我不是很理解函数中为什么要构造cos_matrix这个矩阵以及用奇异值分解来求解相关系数,因此想向您请教一下该函数的相关数学原理出处,期待回复,非常感谢!!!

kwong292521 avatar Jun 27 '22 15:06 kwong292521

  1. 这个的实现其实比较老土的,更新的实现直接对相机内参操作就可以。
  2. cos_matrix应该是命名不规范,其真正的含义是coefficient matrix(系数矩阵)
  3. 这里大概阐述原版的思路,细节推导写起来比较繁琐。大体上是这样,实际上你想求解p2d = A p3d。有一大堆point(一堆p2d和p3d的pair)求解A。然后这里并不能简单的直接算A,你可以看一下flip之前的calib matrix,会发现里面其实只有6个数值,很多的0,所以呢我就对这个公式”p2d = A p3d“进行了整理,写成这种:CX=0。这个X就是要算的6个数字,C就是系数矩阵,用p2d和p3d算出来的。然后对C做svd就好了。
  4. 以上方案在熟悉calib本身后其实并不需要,可以通过其他途径直接计算得到

SuperMHP avatar Jun 29 '22 04:06 SuperMHP

我使用了一个更简单的函数实现了这一功能(直接对内参进行操作,1.翻转后,0号相机与2号相机的相对位置刚好掉转,因此偏移量乘以-1;2.翻转时成像面也翻转了,因此相机的cu相对于图像中轴线也镜像翻转):

def flip_simple(self, img_size):
    img_w = img_size[0]
    _cu = img_w - self.cu
    self.cu = _cu
    self.P2[0, 2] = _cu
    self.tx *= -1
    self.P2[0, 3] *= -1

最终算出来的结果与您的原函数有很小的误差,我感觉应该也是对的?:

calib_1 = Calibration('./kitti/training/calib/000000.txt')
calib_2 = Calibration('./kitti/training/calib/000000.txt')
print("Raw P2:")
print(calib_1.P2)
calib_1.flip([1224, 370])
calib_2.flip_simple([1224, 370])
print("Raw Method:")
print(calib_1.P2)
print("Simple Method:")
print(calib_2.P2)

结果: image

kwong292521 avatar Jul 01 '22 16:07 kwong292521

正确的

SuperMHP avatar Aug 08 '22 05:08 SuperMHP

你是对的,mmdet里也有类似的实现,这就是我说的更容易的那种实现,完全正确。

在 2022年7月2日,00:08,kwong292521 @.***> 写道:

 我使用了一个更简单的函数实现了这一功能(直接对内参进行操作,1.翻转后,0号相机与2号相机的相对位置刚好掉转,因此偏移量乘以-1;2.翻转时成像面也翻转了,因此相机的cu相对于图像中轴线也镜像翻转):

def flip_simple(self, img_size): img_w = img_size[0] _cu = img_w - self.cu self.cu = _cu self.P2[0, 2] = _cu self.tx *= -1 self.P2[0, 3] *= -1 最终算出来的结果与您的原函数有很小的误差,我感觉应该也是对的?:

calib_1 = Calibration('./kitti/training/calib/000000.txt') calib_2 = Calibration('./kitti/training/calib/000000.txt') print("Raw P2:") print(calib_1.P2) calib_1.flip([1224, 370]) calib_2.flip_simple([1224, 370]) print("Raw Method:") print(calib_1.P2) print("Simple Method:") print(calib_2.P2) 结果:

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.

SuperMHP avatar Oct 11 '22 07:10 SuperMHP