知道采集频率后,您现在必须找到标记的连续位置之间的距离。
为了找到这个距离,我建议你估计pose每个图像的标记。宽松地说,“位姿”是表示物体相对于相机的坐标的变换矩阵。一旦获得这些连续的坐标,您就可以计算距离,然后计算速度。
位姿估计是计算物体位置和方向的过程known相对于 2D 相机的 3D 对象。生成的姿势是描述相机参考中的对象参考的变换矩阵。
OpenCV实现了姿态估计算法:Posit。医生说:
给定一些 3D 点(在对象中
坐标系)的对象,在
至少四个非共面点,它们的
相应的二维投影
图像,以及焦距
相机,该算法能够
估计物体的姿态。
这意味着:
- 您必须知道相机的焦距
- 您必须了解标记的几何形状
- 您必须能够匹配 2D 图像中标记的四个已知点
您可能需要使用以下方法计算相机的焦距校准程序由 OpenCV 提供。我认为您已经掌握了另外两个所需的数据。
Edit:
// Algorithm example
MarkerCoords = {Four coordinates of know 3D points}
I1 = take 1st image
F1 = focal(I1)
MarkerPixels1 = {Matching pixels in I1}
Pose1 = posit(MarkerCoords, MarkerPixels1, F1)
I2 = take 2nd image
F2 = focal(I2)
MarkerPixels2 = {Matching pixels in I2 by optical flow}
Pose2 = posit(MarkerCoords, MarkerPixels2, F2)
o1 = origin_of_camera * Pose1 // Origin of camera is
o2 = origin_of_camera * Pose2 // typically [0,0,0]
dist = euclidean_distance(o1, o2)
speed = dist/frequency
Edit 2:(评论回复)
“获取频率是多少?”
计算车辆的速度相当于计算标记的速度。 (在第一种情况下,参照物是附着在地球上的标记,在第二种情况下,参照物是附着在车辆上的摄像头。)这由以下等式表示:
speed = D/(t2-t1)
With:
-
D
距离[o1 o2]
-
o1
标记当时的位置t1
-
o2
标记当时的位置t2
您可以通过提取来检索经过的时间t1
and t2
来自照片的元数据,或来自采集频率您的成像设备:t2-t1 = T = 1/F
.
“标记像海报这样的简单东西不是更好吗?如果这样做,我们不能将其视为二维对象吗?”
这对于 Posit 算法(或据我所知任何其他姿态估计算法)来说是不可能的:它需要四个不共面点。这意味着您不能选择嵌入 3D 空间中的 2D 对象,您必须选择具有一定深度的对象。
另一方面,您可以使用really简单的形状,只要它是一个体积。 (例如立方体。)