OpenCV:计算相机和像素之间的角度

Jea*_*Luc 13 c++ opencv image-processing

我想知道如何计算相对于我正在使用的网络摄像头的照片中某些像素的角度.我是这类新手,我正在使用网络摄像头.基本上,我拍了一张照片,处理它,最后我得到的图像中的像素值就是我正在寻找的.然后,我需要以某种方式将该像素值转换为一些有意义的数量---我需要找到一个穿过像素和相机的线/矢量.我不需要幅度,只需要相位.

怎么去做这个?相机校准是否必要?我一直在读它,但我不确定.

谢谢

Fra*_*ari 13

食谱:

1 - 校准摄像机,获取摄像机矩阵K和失真参数D.在OpenCV中,这将按照本教程中的描述完成.

2 - 从感兴趣的像素位置消除非线性失真.在OpenCV中使用undistortPoints例程完成,而不传递参数R和P.

3 - 通过将它们在齐次坐标中的像素位置乘以相机矩阵的倒数,将相关像素反投影到相机3D坐标中的光线(具有尾部在相机中心的单位矢量).

4 - 您想要的角度是上述矢量与(0,0,1)之间的角度,即与摄像机焦轴关联的矢量.


Jer*_*fin 9

您无需知道与物体的距离,只需要知道相机的分辨率和视角.

计算角度只需要简单的线性插值.例如,让我们假设一个分辨率为1920x1080的相机,覆盖对角线的45度视角.

在这种情况下,sqrt(1920 2 + 1080 2)沿对角线给出2292.19像素.这意味着每个像素代表45/2292.19 = .0153994度.

因此,计算距离中心的距离(以像素为单位),乘以.0153994,然后从中心得到它的角度(对于那个相机 - 对于你的,你显然必须使用它的分辨率和视角).

当然,这有点近似 - 它的准确性将取决于镜头有多少失真.使用变焦镜头(特别是更宽的角度),您通常可以指望它相当高.使用固定焦距镜头(特别是如果它不覆盖大于90度的角度),它通常会非常低.

如果要提高精度,可以先从相机视角内部用直线拍摄扁平矩形图像,然后根据结果图像中完全笔直的偏差计算失真.如果您正在使用极广角镜头,这可能几乎是必不可少的.使用覆盖较窄视角的镜头(特别是,如已经提到的,如果它是固定的焦距),它很可能是值得的(这种镜头通常只有百分之几的失真).

  • @FrancoCallari:你有没有费心阅读整个答案?我专门谈论校准失真,但您(显然)认为它从未被讨论过?[请不要删除downvote - 它让我的代表回到我喜欢的5的倍数)。 (2认同)
  • @杰里科芬。请发明一种算法,能够估计镜头的非线性失真,并且不使用或产生线性部分的估计。然后发表并申请明年的 CVPR'14 最佳论文奖;-) (2认同)