Kal*_*inB 8 python opencv image-processing
如何计算相机前面物体的角度?我的相机分辨率为1280x1024,镜头焦距为8毫米,CMOS上每个像素的像素尺寸为4.8微米。当然,一定可以由此计算出角度。我还计算了物体到相机的距离,一切都在一个水平上。所以只有 X 坐标是有趣的,对吗?
我使用 OpenCV 和 Python 进行处理。
我的想法是使用镜头的焦距与传感器中间检测到的物体的 X 偏移相结合,但我确实从中得到了奇怪的角度。
这是角度估计的代码:
第一个是点 X 坐标,第二个是整个传感器的宽度(1280 像素 * 4.8um)(以毫米为单位),第三个是焦距(以毫米为单位)。
角度 = (pointInterpolatedX*6.144)/8
有人可以在这里给我一些帮助吗?谢谢!
另外,我在这里看过这个主题,但我不太明白。我有更多关于我的相机的信息,而且我的物体只能在二维而不是三维中移动。因此,可能有一种巧妙的方法来估计它在摄像机前地面上的位置。OpenCV 有任何我可以使用的功能吗?
为了获得真正的精度,您需要校准相机。下面的内容足以进行第一个近似。
下图描绘了我将在此响应中使用的图像(Xi、Yi)和相机(Xc、Yc、Zc)坐标系 - 它们是 OpenCV 使用的坐标系。它还显示两个图像点p1和p2,这可能是您感兴趣的对象的图像的边界,以及将它们投影到相机中心的相应光线r1和r2 。
首先,让我们将焦距镜头转换为像素以简化计算。在 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]])
Run Code Online (Sandbox Code Playgroud)
给定该矩阵以及相机坐标中的任何 3D 点P = (X,Y,Z),其投影到图像上的图像坐标(x, y)计算如下:
p = K.dot(P)
x, y = p[0]/p[2], p[1]/p[2]
Run Code Online (Sandbox Code Playgroud)
相反,给定一对像素坐标(x, y),将该像素反投影到 3D 空间的 3D 射线r由下式给出:
Ki = np.linalg.inv(K)
r = Ki.dot([x, y, 1.0])
Run Code Online (Sandbox Code Playgroud)
这是一条“射线”,因为所有 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)
Run Code Online (Sandbox Code Playgroud)
重申一下,上述公式只是第一个近似值。真实的相机会存在一些非线性镜头畸变,您必须对其进行校正才能获得准确的结果,并且焦轴相对于图像会稍微偏心。所有这些问题都可以通过校准相机来解决。
归档时间: |
|
查看次数: |
14626 次 |
最近记录: |