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

14

我想知道如何计算照片中某个像素相对于我使用的网络摄像头的角度。 我对这种事情还不熟悉,而且我正在使用网络摄像头。 基本上,我拍照、处理图像,最终得到的是图像中所需的像素值。 然后,我需要将该像素值转换为一些有意义的量 --- 我需要找到通过像素和相机的一个线/向量。 我不需要幅度,只需要相位。

如何去做呢? 摄像机校准是否必要? 我已经读了一些相关内容,但不确定。

谢谢


2
要做到这一点,您需要知道与像素对应的物体的距离以及相机的视野。 - Oliver Charlesworth
好的,你有什么建议可以帮我解决问题吗?我基本上正在寻找特定颜色的对象。我找到最匹配我要找的颜色的像素坐标,然后需要有一种方法来指示对象的方向...没有深度的情况下这不可能吗?我原以为我可以从像素坐标中得到一些方向。 - Jean-Luc
画出这种情况的图示。你有一个直角三角形,其角落分别是(A)物体,(B)相机和(C)图像中心但在物体深度平面上的一个点。你将如何计算角ABC? - Oliver Charlesworth
请注意,在我的第一条评论中,“and”应该是“or”。 - Oliver Charlesworth
2个回答

15
您无需知道物体的距离,只需知道相机的分辨率和视角。计算角度仅需要简单的线性插值。例如,假设一台相机的分辨率为1920x1080,对角线覆盖了45度的视场角。在这种情况下,sqrt(19202 + 10802)得出2292.19像素沿对角线。这意味着每个像素表示45/2292.19 = .0153994度。因此,计算距离中心(以像素为单位),乘以 .0153994,就可以得到它与中心的角度(对于该相机而言——对于您的相机,您显然需要使用其分辨率和视角)。
当然,这是有些近似的——它的准确性将取决于镜头的畸变程度。通过变焦镜头(特别是广角镜头),你通常可以确定畸变相当高。通过固定焦距镜头(尤其是如果它不涵盖大于90度左右的角度),通常会比较低。
如果要提高准确性,可以首先拍摄一个在相机视野范围内的具有直线的矩形区域的图片,然后根据结果图片中完美直线的偏差计算畸变。如果您使用的是极端广角镜头,这几乎是必要的。对于覆盖较窄视野角度的镜头(尤其是固定焦距镜头),这很少有用(这些镜头通常只有不到1%的畸变)。

@user968243:我相信OpenCV的相机校准旨在测量失真,因此它基本上就是答案最后一段所讨论的内容。其实用处将取决于镜头的失真水平,这一点我不清楚。 - Jerry Coffin
3
@FrancoCallari:你有没有仔细阅读整个答案?我特别谈到了校准畸变,但是你似乎基于假设而进行了投票(降低评分)?(请不要取消投票 - 它可以使我的声誉回到5的倍数,我很喜欢这样)。 - Jerry Coffin
1
@FrancoCallari:...然而OpenCV 文档 表明它确实可以做到这一点。 - Jerry Coffin
2
@JerryCoffin。请发明一种算法,能够估计镜头的非线性失真,并且不使用或产生线性部分的估计。然后发布它并申请参加明年的CVPR'14最佳论文奖;-) - Francesco Callari
1
是的,基本上就是这样。对角线视场角是由一条从一个角到对角线相反角的线覆盖的视场角 - 传统上,当镜头的视场角被评分时,它们所说的就是这个。 - Jerry Coffin
显示剩余5条评论

14

方法:

1 - 校准相机,获得相机矩阵K和畸变参数D。在OpenCV中,可以按照此教程所述进行操作。

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

3 - 将感兴趣的像素反投影到相机三维坐标系中的光线(以相机中心为尾部的单位向量)中,通过将它们在齐次坐标下的像素位置乘以相机矩阵的逆来完成。

4 - 你需要的角度是上述向量与(0, 0, 1)之间的角度,后者是与相机焦轴相关联的向量。


你好,我想从像素P位置到达方位向量。这是一个单位向量,从相机中心指向由像素P识别的对象。为了做到这一点,我应该只到达您描述的第3点。camera_matrix是3x3矩阵,例如从相机校准中得出。这一切都正确吗?提前致谢。 - desmond13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接