简而言之...分解单应性矩阵返回的平移矩阵实际上是一个 3X1 矩阵(实际上是一个向量)。然而,平移矩阵的每个描述都是一个 3X2 矩阵。
这是两个图像(红外摄像机),位置 1 图像(大约摄像机笛卡尔坐标 x = 0mm,y=300mm):
这是位置 2 图像(大约相机笛卡尔坐标 x = 680mm,y=0mm):
我使用以下+90个点来确定单应性矩阵(M):
M, mask = cv2.findHomography(source_pts, destination_pts, cv2.RANSAC,5.0)
如果将此单应性矩阵应用于原始图像 - 它会完美地工作:
im_out = cv2.warpPerspective(img1,M, (640,480) )
与输出点集的差值:
np.mean(dst_pts-src_pts , axis = 0)
array([[-305.16345, -129.94157]], dtype=float32)
非常接近单个点的单应性矩阵的点积......
np.dot(M,[1,1,1])
array([-293.00352303, -132.93478376, 1.00009461])
我使用以下命令分解了单应性矩阵:
num, Rs, Ts,Ns = cv2.decomposeHomographyMat(M, camera_matrix)
这将返回 4 个解(num)、一个旋转矩阵、一个平移矩阵和 Ns(不记得它是什么)。
我对翻译矩阵感兴趣。
首先... 翻译矩阵列出了 4 个解决方案(这是正确的吗?):
Ts =
[array([[-0.60978834],[-0.26268874],[ 0.01638967]]),
array([[ 0.60978834], [ 0.26268874],[-0.01638967]]),
array([[-0.19035409],[-0.06628793],[ 0.63284046]]),
array([[ 0.19035409], [ 0.06628793],[-0.63284046]])]
其次,也是最令人费解的一点 每个解决方案都有 3 个值...
e.g., the first solution: [-0.6097, -0.2626, 0.01638967].
如何将分解矩阵返回的值转换为上述形式的平移矩阵? **即...我如何转换它: [-0.6097、-0.2626、0.01638967]
感谢您的帮助。
最佳答案
让我们采用您的第一个翻译向量:
np.array([-0.60978834, -0.26268874, 0.01638967])
对我来说,这些看起来像是您的 tx
、ty
和 tz
估计的翻译组件。另外,当我查看带有绿点的图像时,这些数量是有意义的。所以我猜你的齐次坐标平移矩阵是:
M = np.array([[1, 0, 0, -0.60978834], [0, 1, 0, -0.26268874], [0, 0, 1, 0.01638967]])
或者简单地说:
M = np.array([[1, 0, -0.60978834], [0, 1, -0.26268874]])
如果忽略 tz
组件。这不是您要找的吗?
关于python - 为什么OpenCV分解的单应性平移矩阵有三个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59979341/