从图像中查找车辆的速度

Ron*_*ese 7 python performance opencv image-processing opticalflow

我正在做一个项目,从图像中找到车辆的速度.我们从车内拍摄这些图像.我们将从第一张图像中标记一些对象作为参考.使用下一图像中同一对象的属性,我们必须计算移动车辆的速度.有人能帮我一下吗???我正在使用python opencv.我已经成功,直到使用光流法找到第二图像中的标记像素.其他人可以帮助我吗?

Jul*_*n-L 11

知道了采集频率,您现在必须找到标记连续位置之间的距离.

为了找到这个距离,我建议你估算每个图像的标记姿势.松散地说,"姿势"是表示物体相对于相机的坐标的变换矩阵.获得这些连续坐标后,您可以计算距离,然后计算速度.

姿态估计是计算已知 3D对象相对于2D相机的位置和方向的过程.生成的姿势是转换矩阵,用于描述对象在相机参考中的参照.

姿势描述

OpenCV实现了姿势估计算法:Posit.医生说:

给定对象的一些3D点(在对象坐标系中),至少四个非共面点,它们在图像中的相应2D投影以及相机的焦距,该算法能够估计对象的姿势.

这意味着:

  1. 您必须知道相机的焦距
  2. 您必须知道标记的几何形状
  3. 您必须能够在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
Run Code Online (Sandbox Code Playgroud)

编辑2 :(评论的答案)

"收购频率是多少?"

计算车辆的速度相当于计算标记的速度.(在第一种情况下,参考是连接到地球的标记,在第二种情况下,参考是连接到车辆的摄像机.)这由以下等式表示:

speed = D/(t2-t1)
Run Code Online (Sandbox Code Playgroud)

附:

  • D 距离 [o1 o2]
  • o1 标记的位置 t1
  • o2 标记的位置 t2

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

"用海报标记简单的东西不是更好吗?如果这样做不能将它视为二维物体?"

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

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