OpenCV:计算相机和物体之间的角度

问题描述 投票:0回答:2

如何计算相机前方物体的角度?我的相机分辨率为1280x1024,我的镜头焦距为8mm,CMOS上每个像素的像素尺寸为4.8微米。当然必须能够从中计算出角度。此外,我计算了物体到相机的距离,一切都在一个层面上。所以只有X坐标才有意思,对吗?

我正在使用OpenCV和Python进行处理。

我的想法是使用镜头的焦距与传感器中间检测到的物体的X偏移相结合,但我确实得到了奇怪的角度。

这是角度估算的代码:

首先是点X坐标,第二个是整个传感器的宽度(1280像素* 4.8um),单位为mm,第三个是焦距,单位为mm。

angle =(pointInterpolatedX * 6.144)/ 8

有人能在这里给我一些帮助吗?谢谢!

此外,我看了这个主题here,但我不太明白。我有更多关于我的相机的信息,而且我的物体只能移动到2维而不是3维。所以可能有一种聪明的方法来估计它在镜头前的地面位置。 OpenCV是否有任何我可以使用的功能?

python opencv image-processing
2个回答
3
投票

要获得任何真正的准确度,您需要校准相机。以下内容仅适用于第一次近似。

下图描绘了我将在此响应中使用的图像(Xi,Yi)和相机(Xc,Yc,Zc)坐标系 - 它们是OpenCV使用的坐标系。它还显示了两个图像点p1和p2,它们可能是您感兴趣对象图像的边界,以及相应的光线r1和r2将它们投影到相机中心。

Image axes

首先,让我们将您的聚焦镜头转换为像素,以简化计算。点距为4.8 um时,传感器的宽度为4.8 * 1280 um = 6.14 mm。因此,按比例,f_pix:8 mm = 1280像素:6.14 mm,因此f_pix = 1667像素。我们现在可以编写最简单的针孔摄像机矩阵,假设摄像机的焦轴与图像正交,并在图像的中心与其相交。在numpy的表示法中:

K = np.array([[1667, 0, 640], [0, 1667, 512], [0, 0, 1]])

给定此矩阵,以及相机坐标中的任何3D点P =(X,Y,Z),其投影到图像上的图像坐标(x,y)计算如下:

p = K.dot(P)
x, y = p[0]/p[2], p[1]/p[2]

相反,给定一对像素坐标(x,y),将该像素反投影到3D空间中的3D光线r由下式给出:

Ki = np.linalg.inv(K)
r = Ki.dot([x, y, 1.0])

这是一种“射线”,在某种意义上,所有3D点R = s * r,通过将其乘以任意数s得到,将位于通过摄像机中心和像素(x,y)的同一条线上。

因此,给定您的边界图像点p1 =(x1,y1)和p2 =(x2,y2),您可以计算如上所述的光线r1和r2将它们反投影到3D空间中。它们之间的角度很容易通过点积公式计算:

cos_angle = r1.dot(r2) / (np.linalg.norm(r1) * np.linalg.norm(r2))
angle_radians = np.acos(cos_angle)

重申一下,上述公式只是第一个近似值。真正的相机会产生一些非线性镜头失真,您必须进行校正以获得准确的结果,并且焦点轴会相对于图像略微偏离中心。所有这些问题都通过校准相机来解决。


0
投票

你不需要知道你的摄像机角度需要一个量角器并测量它比你可以使用这样的东西

x,y=my_coordinates
angle_per_pix=my_cam_angle/1280
angle_vertical=(x-640)*angle_per_pix #-640 beacuse you want angle between middle of camera
angle_horizontal=(x-512)*angle_per_pix

my_cam_angle的示例:

cam view

angle

© www.soinside.com 2019 - 2024. All rights reserved.