我该如何计算相机前面的物体的角度?我的相机分辨率为1280x1024,镜头的焦距为8mm,CMOS上每个像素的像素大小为4.8微米。当然,必须有可能据此计算角度。我也计算了物体到相机的距离,一切都在一个水平上。所以只有X坐标很有趣,对吧?
我正在使用OpenCV和Python进行处理。
我的想法是结合使用镜头的焦距和从传感器中央到被检测物体的X偏移,但是我确实从那里得到了怪异的角度。
这是角度估计的代码:
第一个点X坐标,第二个整个传感器的宽度(1280像素* 4.8um),以毫米为单位,第三个焦距,以毫米为单位。
angle =(pointInterpolatedX * 6.144)/ 8
有人可以在这里给我一些帮助吗?谢谢!
此外,我看了这个主题here,但我不太明白。我有很多关于相机的信息,而且我的对象只能在2维而不是3维中移动。因此,可能有一种聪明的方法来估计其在相机前面地面上的位置。 OpenCV是否具有我可以使用的任何功能?
答案 0 :(得分:3)
要获得真正的准确性,您需要校准摄像机。只需初步近似就可以满足要求。
下面的图片描述了我将在此响应中使用的图片(Xi,Yi)和相机(Xc,Yc,Zc)坐标系-它们是由OpenCV使用的。它还显示两个图像点 p1 和 p2 ,它们可能是您感兴趣的对象的图像的边界,以及相应的光线 r1 和 r2 将它们投影到相机中心。
首先,让我们将聚焦透镜转换为像素以简化计算。点间距为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)