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

时间:2013-07-06 03:30:53

标签: c++ opencv image-processing

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

如何做到这一点?相机校准是否必要?我一直在读它,但我不确定。

由于

2 个答案:

答案 0 :(得分:13)

配方:

1 - 校准相机,获取相机矩阵K和失真参数D.在OpenCV中,这是按照tutorial中所述完成的。

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

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

4 - 你想要的角度是上面矢量和(0,0,1)之间的角度,这是与摄像机焦轴相关的矢量。

答案 1 :(得分:9)

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

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

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

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

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

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