python opencv 标定相机_基于opencv-python摄像机标定的鸟瞰视角变换

我试图从相机的内、外矩阵和失真系数中得到鸟瞰视角的变换。在

我试着用this问题的答案。在

使用的图像是opencv官方github repo中的示例图像left02.jpg

我校准了相机,找到了内、外矩阵和畸变系数。在

我打开图像,找到了这个姿势。检查参数是否正确。在

我用来寻找透视变换矩阵的公式是(参考上面的链接):

Hr = K * R.inv() * K.inv()其中R是旋转矩阵(来自cv2.Rodrigues()),K来自cv2.getoptiminaNewCameraMatrix()[ 1 0 | ]

Ht = [ 0 1 | -K*C/Cz ]

[ 0 0 | ]

其中C=-R.inv()*T其中T是cv2.solvePnP()的平移向量

Cz是C向量的第三个分量

所需的转换是:H = Ht * Hr

我用来构造上述方程的代码是:

^{pr2}$

产生的扭曲图像不正确。

如果我用下面的代码从单应性中删除翻译homography = Hr.copy()

warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]))

我得到了下面的图像

我认为上面的图片表明我的旋转部分是正确的,但我的翻译是错误的。在

由于平移矩阵(Ht)是一个增广矩阵,所以我不确定上述矩阵的构造是否正确。在

我特别想从相机校准中找出鸟眼的透视变换。在

那么,我如何修正上面的方程式,这样我就能得到棋盘图像的完美鸟瞰图了

还有谁能解释一下以上公式是怎么推导出来的吗?我没有太多的线性代数知识,所以这些方程对我来说不是很明显。在

更新: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 flag给了我一个不同的结果

仍然不是我要找的结果!在

你可能感兴趣的:(python,opencv,标定相机)