重建:为什么不成形图像和标准化坐标?

时间:2018-04-03 03:30:00

标签: python opencv 3d-reconstruction

来自教程:https://programtalk.com/vs2/?source=python/8176/opencv-python-blueprints/chapter4/scene3D.py 我不明白为什么他们首先不失真的图像

 # undistort the images
 self.img1 = cv2.undistort(self.img1, self.K, self.d)
 self.img2 = cv2.undistort(self.img2, self.K, self.d)

和:计算基本矩阵

def _find_fundamental_matrix(self):
        self.F, self.Fmask = cv2.findFundamentalMat(self.match_pts1,
                                                    self.match_pts2,
                                                    cv2.FM_RANSAC, 0.1,0.99)

def _find_essential_matrix(self):
        self.E = self.K.T.dot(self.F).dot(self.K)

以及标准化坐标:

first_inliers = []
second_inliers = []
for i in range(len(self.Fmask)):
    if self.Fmask[i]:
        # normalize and homogenize the image coordinates
        first_inliers.append(self.K_inv.dot([self.match_pts1[i][0],
                             self.match_pts1[i][1], 1.0]))
        second_inliers.append(self.K_inv.dot([self.match_pts2[i][0],
                              self.match_pts2[i][1], 1.0]))

不应该 吗?或者我在这里有一些错误的理解? 请somone帮助我吗?

2 个答案:

答案 0 :(得分:1)

第一步undistort做了很多工作来扭转小型相机镜头造成的典型翘曲。有关更多背景信息,请参阅distortion (optics)上的维基百科文章。

最后一步,将坐标均匀化,是完全不同的事情。关于homogenous coordinates的维基百科文章解释了它,但基本的想法是你添加了一个额外的伪轴,让你用链式简单矩阵乘法进行所有仿射和投影变换,然后在最后投射回3D。归一化只是使数学运算更容易的一步 - 基本上,你希望你的额外坐标从1.0开始(乘以投影范数的倒数)。

答案 1 :(得分:0)

Multi-View Geometry (Hartley and Zisserman)的第107页解释了规范化的要求。除了失真之外,还需要归一化。

如果在齐次坐标中使用原始像素值,则与X和Y共同坐标相比,Z坐标1将是小的。例如:(X = 320,Y = 220,Z = 1)。

但是如果均匀化坐标是标准化到标准范围的图像像素位置,即-1.0到1.0,那么我们所讨论的坐标值都在同一范围内,例如:(0.75,-0.89 ,1.0)。

如果图像坐标具有显着不同的范围(如在非标准化情况下),则所产生的DLT矩阵将具有不良条件数,并且因此输入图像像素位置的小变化可能在结果中产生大的变化。

请参阅第107页,以获得非常好的解释。