我正在做一个项目来从图像中找到车辆的速度。我们正在车内拍摄这些图像。我们将从第一张图像中标记一些对象作为参考。利用下一张图像中同一物体的属性,我们必须计算移动车辆的速度。有人能帮我一下吗???我正在使用 python opencv。我已经成功地使用光流方法在第二张图像中找到了标记的像素。任何人都可以帮我解决剩下的问题吗?
1 回答
知道采集频率后,您现在必须找到标记的连续位置之间的距离。
为了找到这个距离,我建议你为每张图像估计标记的姿势。松散地说,“位姿”是表示物体相对于相机坐标的变换矩阵。一旦你有了这些连续的坐标,你就可以计算距离,然后是速度。
姿态估计是计算已知3D 对象相对于 2D 相机的位置和方向的过程。生成的姿势是描述对象在相机参考中的参考的变换矩阵。
OpenCV 实现了一种姿态估计算法:Posit。医生说:
给定对象的一些 3D 点(在对象坐标系中)、至少四个非共面点、它们在图像中对应的 2D 投影以及相机的焦距,该算法能够估计对象的姿态。
这表示:
- 你必须知道你的相机的焦距
- 您必须知道标记的几何形状
- 您必须能够匹配 2D 图像中标记的四个已知点
您可能必须使用OpenCV 提供的校准例程来计算相机的焦距。我认为您还有另外两个必需的数据。
编辑:
// 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
编辑2:(对评论的回答)
“采集频率是多少?”
计算车辆的速度相当于计算标记的速度。(在第一种情况下,参照物是附着在地球上的标记,在第二种情况下,参照物是附着在车辆上的相机。)这由以下等式表示:
speed = D/(t2-t1)
和:
D
距离[o1 o2]
o1
时间标记的位置t1
o2
时间标记的位置t2
您可以通过提取照片的元数据或从成像设备的采集频率来检索t1
经过t2
的时间:t2-t1 = T = 1/F
.
“标记海报之类的简单事物不是更好吗?如果这样做,我们不能将其视为二维对象吗?”
这对于 Posit 算法(或据我所知的任何其他姿势估计算法)是不可能的:它需要四个非共面点。这意味着您不能选择嵌入在 3D 空间中的 2D 对象,您必须选择具有一定深度的对象。
另一方面,你可以使用一个非常简单的形状,只要它是一个体积。(例如一个立方体。)