OpenCV:计算相机和对象之间的角度

时间:2019-03-09 18:42:35

标签: python opencv image-processing

我该如何计算相机前面的物体的角度?我的相机分辨率为1280x1024,镜头的焦距为8mm,CMOS上每个像素的像素大小为4.8微米。当然,必须有可能据此计算角度。我也计算了物体到相机的距离,一切都在一个水平上。所以只有X坐标很有趣,对吧?

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

我的想法是结合使用镜头的焦距和从传感器中央到被检测物体的X偏移,但是我确实从那里得到了怪异的角度。

这是角度估计的代码:

  

第一个点X坐标,第二个整个传感器的宽度(1280像素* 4.8um),以毫米为单位,第三个焦距,以毫米为单位。

     

angle =(pointInterpolatedX * 6.144)/ 8

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

此外,我看了这个主题here,但我不太明白。我有很多关于相机的信息,而且我的对象只能在2维而不是3维中移动。因此,可能有一种聪明的方法来估计其在相机前面地面上的位置。 OpenCV是否具有我可以使用的任何功能?

2 个答案:

答案 0 :(得分:3)

要获得真正的准确性,您需要校准摄像机。只需初步近似就可以满足要求。

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

Image axes

首先,让我们将聚焦透镜转换为像素以简化计算。点间距为4.8微米时,传感器的宽度为4.8 * 1280微米= 6.14毫米。因此,按比例,f_pix:8毫米= 1280像素:6.14毫米,因此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)

重申一下,以上公式只是一个近似值。真实的相机会出现一些非线性镜头畸变,您必须对其进行校正才能获得准确的结果,并且其焦轴相对于图像稍微偏心。通过校准相机可以解决所有这些问题。

答案 1 :(得分: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