从图像中查找车辆的速度

时间:2011-02-02 09:17:09

标签: python image-processing opencv performance opticalflow

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

1 个答案:

答案 0 :(得分:11)

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

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

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

Pose description

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

  

给出一些3D点(在对象中)   对象的坐标系,at   至少四个非共面点,他们的   相应的二维投影   图像和焦距   相机,算法是能够的   估计物体的姿势。

这意味着:

  1. 您必须知道相机的焦距
  2. 您必须知道标记的几何图形
  3. 您必须能够在2D图像中匹配标记的四个已知点
  4. 您可能需要使用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,或从成像设备的采集频率中检索已用时间:{{1 }}

      

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

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

    另一方面,您可以使用真正的简单形状,只要它是一个卷。 (例如一个立方体。)