【发布时间】:2018-07-12 13:34:12
【问题描述】:
我正在尝试从相机内在、外在矩阵和失真系数中获得鸟瞰视角变换。
我尝试使用this问题的答案。
使用的图片是来自opencv官方github repo的示例图片left02.jpg
我校准了相机并找到了内在、外在矩阵和失真系数。
我未扭曲图像并找到姿势。检查参数是否正确。
我用来求透视变换矩阵的方程是(参考上面的链接):
Hr = K * R.inv() * K.inv() 其中 R 是旋转矩阵(来自 cv2.Rodrigues()),K 来自 cv2.getoptimalnewcameramatrix()
[ 1 0 | ]
Ht = [ 0 1 | -K*C/Cz ]
[ 0 0 | ]
C=-R.inv()*T 哪里 T 是来自cv2.solvePnP() 的平移向量
Cz 是 C 向量的第三个分量
所需的转换是:H = Ht * Hr
我用来构造上述等式的代码是:
K = newcameramtx # from cv2.getoptimalnewcameramatrix()
ret,rvec,tvec = cv2.solvePnP(world_points,corners2,K,dist)
R,_ = cv2.Rodrigues(rvec)
_,R_inv = cv2.invert(R)
_,K_inv = cv2.invert(K)
Hr = np.matmul(K,np.matmul(R_inv,K_inv))
C = np.matmul(-R_inv,tvec)
Cz = C[2]
temp_vector = np.matmul(-K,C/Cz)
Ht = np.identity(3)
for i,val in enumerate(temp_vector):
Ht[i][2] = val
homography = np.matmul(Ht,Hr)
warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]))
# where img is the above undistored image with visualized pose
如果我使用以下代码从单应性中删除翻译
homography = Hr.copy()
warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]))
我认为上图显示我的旋转部分是正确的,但我的翻译是错误的。
由于平移矩阵 (Ht) 是增广矩阵,我不确定上述矩阵的构造是否正确。
我特别想从相机校准中找出鸟瞰透视变换。
那么,我该如何修正上述等式,以便获得棋盘图像的完美鸟瞰图
还有谁能解释一下上述 Ht 和 Hr 等式是如何推导出来的?我没有太多接触线性代数,所以这些方程对我来说不是很明显。
更新:
homography = np.matmul(Ht,Hr)
warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]),flags=cv2.WARP_INVERSE_MAP)
cv2.WARP_INVERSE_MAP 标志给了我不同的结果
仍然不是我想要的结果!
【问题讨论】:
-
您的代码中的
R是什么?校准的外在因素?您需要的是当前姿势的相机和导致鸟瞰图的相机之间的旋转。看看这个tutorial。 -
R 是我从 cv2.Rodrigues() 获得的旋转矩阵。 SolvePnP 返回旋转向量,并使用上述函数将其转换为旋转矩阵。而外在矩阵是[R|T]
标签: python opencv matrix camera-calibration perspective