来自教程: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帮助我吗?
答案 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页,以获得非常好的解释。