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

2024-09-23 04:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我怎样才能计算出相机前物体的角度?我的相机分辨率是1280x1024,镜头焦距是8毫米,CMOS上每个像素的像素大小是4.8微米。当然,从这个角度来计算角度是可能的。我还计算了物体到摄像机的距离,一切都在同一水平面上。所以只有X坐标才有意思,对吧?在

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

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

这是角度估计的代码:

first the point X coordinate, second the width of the whole sensor (1280 pixels * 4.8um) in mm, third the focal length in mm.

angle = (pointInterpolatedX*6.144)/8

有谁能帮我一下吗?谢谢!在

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


Tags: thein距离水平分辨率像素传感器opencv
2条回答

为了获得真正的准确度,你需要校准相机。下面的结果对于一阶近似就足够了。在

下面的图像描述了我将在这个响应中使用的图像坐标系(Xi,Yi)和相机坐标系(Xc,Yc,Zc)它们是OpenCV使用的坐标系。它还显示两个图像点p1p2,这可能是您感兴趣对象的图像的边界,并且相应的光线r1r2将它们投影到相机中心。在

Image axes

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

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

给定该矩阵,且摄像机坐标中的任何3D点p=(X,Y,Z),其投影到图像上的图像坐标(X,Y)计算如下:

^{pr2}$

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

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

这是一条“射线”,在这个意义上,所有3D点R=s*R将位于穿过相机中心和像素(x,y)的同一条线上。在

因此,给定边界图像点p1=(x1,y1)p2=(x2,y2),您可以如上所述计算射线r1r2将它们反向投影到三维空间中。它们之间的角度可以通过点积公式轻松计算:

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

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

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

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

我的凸轮角示例:

cam view

angle

相关问题 更多 >