从图像中找到车辆的速度

7

我正在进行一个项目,通过图像来找到车辆的速度。我们从车内拍摄这些图像。我们将在第一张图像中标记某些物体作为参考。使用下一张图像中相同物体的属性,我们必须计算移动车辆的速度。有人可以帮助我吗?我正在使用Python OpenCV。我已经成功地使用光流法找到了第二张图像中标记的像素。有人可以帮我完成剩下的部分吗?


这不也高度取决于拍摄图像所使用的相机吗? 快门速度也应该被考虑。 - darioo
3
需要考虑的因素很多,例如标记物距离车辆行进路线的垂直距离,两张图片之间的时间。 - mauris
1
当询问与图像处理相关的问题时,示例图片通常是很有帮助的。 - bjoernz
我目前正在考虑所有的可能性。到目前为止的代码基本上是在Opencv样例中找到的部分编辑过的lkdemo.py。 - Rony Varghese
使用图像的元数据可以更轻松地找到相机属性,这些属性将由相机本身附加到图像上。因此,这不是问题。我想要的是在此之后的程序。 - Rony Varghese
显示剩余3条评论
1个回答

11
了解采集频率后,现在需要找到标记的连续位置之间的距离。
为了找到这个距离,建议您对每个图像估算标记的姿态。泛指而言,“姿态”是表达物体相对于相机坐标的变换矩阵。一旦您获得了这些连续的坐标,就可以计算距离,然后计算速度。
姿态估计是计算已知三维物体相对于二维相机的位置和方向的过程。所得到的姿态是描述物体参考系在相机参考系中的变换矩阵。

Pose description

OpenCV 实现了一个姿态估计算法: Posit。文档说:
给定物体坐标系下的一些 3D 点(至少四个不共面点)、它们在图像中对应的 2D 投影、相机的焦距,该算法能够估计物体的姿态。
这意味着:
  1. 您必须知道相机的焦距
  2. 您必须知道标记的几何形状
  3. 您必须能够匹配图像中四个已知点与标记上的对应点
您可能需要使用 OpenCV 提供的calibration routines来计算相机的焦距。我认为您已经有了另外两个所需的数据。 编辑:
// 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 的位置

您可以通过从照片元数据中提取t1t2或从图像设备的采集频率中检索经过的时间:t2-t1 = T = 1/F

"标记简单的东西(如海报)不是更好吗?如果这样做,我们可以将其视为二维对象吗?"

这在Posit算法(或据我所知的任何其他姿态估计算法)中是不可能的:它需要四个非共面点。这意味着您不能选择嵌入3D空间的2D对象,而必须选择具有一定深度的对象。

另一方面,只要是体积,您就可以使用非常简单的形状。(例如一个立方体。)


我有一个严重的疑问。既然我们将有自由标记对象,那么标记简单的东西如海报(主要是矩形形状)不是更好吗?如果这样做,我们可以将其视为2D对象吗?什么是采集频率?我对这种术语有点陌生。 - Rony Varghese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接