【问题标题】:Find angle between normal and perspective images查找正常图像和透视图像之间的角度
【发布时间】:2018-07-09 02:32:15
【问题描述】:

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

普通棋盘: Normal

透视棋盘: Perspective

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

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

谢谢!

【问题讨论】:

  • 您需要检测两个图像中的一些枢轴点,然后比较这些值,您可以计算偏航、俯仰和滚动,如回答here 我已经拿了 6 分,也建议选择任意 6 个突出点,如 4 个角、2 个中间白色和黑色块的交点等。
  • @ZdaR 感谢您的回答!如何找到 3D 点?

标签: python opencv math computer-vision


【解决方案1】:

Francesco 给出了非常明智的回答。但是,如果您没有“透视图”的相机内在特性(焦距、主点等),则需要估计它们。

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

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

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

但是,如果您只有一个透视图,这是不可能的,您必须使用简化的相机内在矩阵。通常,您只需校准相机的焦距即可。为此,您需要传递 calibrateCamera 带有 K = [0,0,px;0,0,py;0,0,1] 的 cameraMatrix K,其中 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。

【讨论】:

    【解决方案2】:

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

    对于每个图像,您将它们写在齐次坐标中,并将它们归一化为单位欧几里得范数。那么它们的叉积就是垂直于棋盘平面的单位向量,在相机坐标中分解。

    对两个图像都这样做,然后计算找到的法向量之间的角度:这就是您想要的平面之间的角度。

    【讨论】:

    • 但这种方法需要对“透视”视图的相机图像进行内在校准。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2013-10-15
    • 2017-05-08
    相关资源
    最近更新 更多