查找普通图像和透视图像之间的角度

时间:2018-01-30 09:01:55

标签: python opencv math computer-vision

我有2张相机棋盘照片。我需要找到2张图像上的平面之间的角度。例如,我们有正常的“棋盘”图像,经过一些变换后,我们在透视图“chessboard2”中获得了一个新图像。是否有可能找到这些平面之间的角度?

普通棋盘: Normal

透视棋盘: Perspective

为了理解:我试图找到平面之间的角度φimage φ

我试图通过python(opencv)程序来解决这个问题。我使用cv2.getPerspectiveTransform()函数来查找变换矩阵,但我不能拉出我需要的角度:(

谢谢!

2 个答案:

答案 0 :(得分:2)

弗朗西斯科给出了一个非常明智的答案。但是,如果您没有“透视视图”的相机内在函数(焦距,主要点等),则需要对其进行估算。

由于您的图像是常规棋盘格,因此您可以使用OpenCV的相机校准方法和自动棋盘格检测来完成此操作。请参阅opencv_source_code / samples / cpp / calibration.cpp以获得一个很好的演示。

在校准示例中,您可以使用-o标志指定要输出相机外部矩阵(即将平面目标转换为透视图的旋转R和平移t)。 “正常”和“透视”视图中两个平面之间的角度仅为acos(R22),其中R22是R中的右下角元素。

关于校准的一个重点。如果您从不同角度拥有多个透视图,并且您确定相机内在函数对于所有视图都是常量,那么您可以对整个内部矩阵进行常规校准,如校准示例中所做的那样。

但是,如果您只有一个透视图,则无法进行此操作,您必须使用简化的相机内部矩阵。通常只需校准相机的焦距就可以做到这一点。要做到这一点,你需要传递calibrateCamera一个cameraMatrix K,其中K = [0,0,px; 0,0,py; 0,0,1],其中px是图像宽度的一半,py是一半图像高度(透视图)。您还传递calibrateCamera一个大小为3x1且所有元素为零的失真矩阵。最后,您需要确保通过设置以下标志在calibrateCamera的调用中仅估计焦距:CALIB_FIX_ASPECT_RATIO,CALIB_FIX_PRINCIPAL_POINT,CALIB_ZERO_TANGENT_DIST,CALIB_FIX_K1,CALIB_FIX_K2,CALIB_FIX_K3。

答案 1 :(得分:0)

最简单的方法是估计棋盘的水平和垂直方向的vanishing points - 并注意它们都是“正常”图像中的无穷远点。

对于每个图像,您可以用齐次坐标编写它们,并将它们标准化为单位欧几里德范数。然后他们的叉积是垂直于棋盘平面的单位矢量,用相机坐标分解。

对两个图像执行此操作,然后计算找到的法线向量之间的角度:这是您想要的平面之间的角度。