13

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

如何做到这一点?是否需要相机校准?我已经阅读了一些关于它的信息,但不确定。

谢谢

4

2 回答 2

13

食谱:

1 - 校准相机,获得相机矩阵 K 和失真参数 D。在 OpenCV 中,这是按照本教程中的描述完成的。

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

3 - 通过将它们在齐次坐标中的像素位置乘以相机矩阵的倒数,将感兴趣的像素反向投影到相机 3D 坐标中的射线(尾部位于相机中心的单位向量)中。

4 - 您想要的角度是上述向量与 (0, 0, 1) 之间的角度,该向量与相机的焦轴相关联。

于 2013-07-06T16:57:24.793 回答
12

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

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

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

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

当然,这有点近似——它的准确性将取决于镜头的失真程度。使用变焦镜头(尤其是广角),您通常可以指望它相当高。使用固定焦距镜头(特别是如果它不覆盖超过 90 度左右的角度),它通常会很低。

如果您想提高准确度,您可以首先在相机视角内拍摄带有直线的平面矩形的照片,然后根据结果图片中与完全直线的偏差来计算失真。如果您使用的是超广角镜头,这可能几乎是必不可少的。对于覆盖更窄视角的镜头(特别是,如前所述,如果它是固定焦距),它几乎不值得(这样的镜头通常只有百分之几的失真)。

于 2013-07-06T04:03:19.017 回答