Python OpenCV:计算摄影机和对象之间的角度

Python OpenCV:计算摄影机和对象之间的角度,python,opencv,image-processing,Python,Opencv,Image Processing,如何计算相机前物体的角度?我的相机分辨率为1280x1024,镜头焦距为8mm,CMOS上每个像素的像素大小为4.8微米。当然,从这个角度来计算角度是可能的。我还计算了物体到相机的距离,所有的东西都在一个水平面上。所以只有X坐标是有趣的,对吗 我正在使用OpenCV和Python进行处理 我的想法是将镜头的焦距与探测到的物体从传感器中间的X偏移量结合起来,但我确实从中得到了奇怪的角度 这是用于角度估计的代码: 首先是点X坐标,其次是整个传感器的宽度(1280像素*4.8um),单位为mm,第三是

如何计算相机前物体的角度?我的相机分辨率为1280x1024,镜头焦距为8mm,CMOS上每个像素的像素大小为4.8微米。当然,从这个角度来计算角度是可能的。我还计算了物体到相机的距离,所有的东西都在一个水平面上。所以只有X坐标是有趣的,对吗

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

我的想法是将镜头的焦距与探测到的物体从传感器中间的X偏移量结合起来,但我确实从中得到了奇怪的角度

这是用于角度估计的代码:

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

角度=(点插值x*6.144)/8

有人能帮我一下吗?谢谢

另外,我看了一下这个话题,但我不太明白。我有很多关于我相机的信息,而且我的物体只能在二维空间移动,不能在三维空间移动。因此,可能有一种聪明的方法来估计它在摄像机前地面上的位置。
OpenCV有什么功能我可以使用吗?

不,你需要知道你的相机角度,拿一个量角器测量它,你就可以使用这样的东西了

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
我的凸轮角度示例:


要获得真正的精度,您需要校准相机。下面的内容仅适用于一次近似

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

首先,让我们将焦距镜头转换为像素,以简化计算。点间距为4.8微米时,传感器的宽度为4.8*1280微米=6.14毫米。因此,按比例,f_pix:8 mm=1280 pix: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),将该像素向后投影到三维空间的三维光线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向三维空间的反向投影。它们之间的角度可通过点积公式轻松计算:

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

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

所以my_cam_角度是垂直/水平视野?在本例中,如果测量水平,则需要除以h像素。最后一个公式给出了两条光线之间的角度,对吗?不是从焦点轴到其中一条光线。正确。如果你想从中心得到光线,只需计算r=Ki.dot([x,y,1]),x=width/2,y=height/2@FrancescoCallari我尝试使用相同的代码来查找距离,但不准确(@Francescocalari)我用这个方法找到了两点之间的角度,我试图找到这两点之间的距离points@Roger如果您知道它们与摄影机中心的距离,答案很简单,只需将余弦定理应用于摄影机中心和点形成的三角形,使用计算为的光线之间的角度如果你不知道它们离相机有多远,除非你有关于场景的附加信息,否则无法完成。