gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:07:35 25 4
gpt4 key购买 nike

如何计算相机前物体的角度?我的相机分辨率是1280x1024,镜头焦距是8mm,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 ,但我不太明白。我有很多关于我的相机的信息,而且我的对象只能在 2 个维度而不是三个维度中移动。所以可能有一种聪明的方法来估计它在相机前面的地面上的位置。OpenCV 是否有任何我可以使用的函数?

最佳答案

要获得真正的准确性,您需要校准相机。以下内容足以进行初步近似。

下图描绘了我将在此响应中使用的图像(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 像素。我们现在可以编写最简单的针孔相机矩阵,它假设相机的焦轴与图像正交,并在图像的中心与它相交。在 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),您可以像上面的射线那样计算 r1r2 将它们反投影到 3D 空间中。它们之间的角度很容易从点积公式计算出来:

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

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

关于python - OpenCV:计算相机和物体之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55080775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com