2016-04-05 40 views
-1

我正在做一个项目,在OpenCV上估计使用捕获的视频移动车辆的速度。这里的相机是静止的。我用质心和欧几里得距离估计了单个物体的速度。现在的问题是,我没有得到如何为多个对象做同样的事情。这里,我需要计算2个连续帧之间的物体的欧几里德距离。 我很感激,如果有人会帮助。使用C++跟踪openCV中的多个对象

我创建了讲座

class centroids 
{ 
    public: 
     vector<Point2f> ce; 
     vector<float> area; 
}; 
centroids c[100]; 

这是我写的代码。我将不胜感激,如果有人帮我用代码:

findContours(fgMaskMOG2, 
       contours, 
       hierarchy, 
       CV_RETR_CCOMP, 
       CV_CHAIN_APPROX_SIMPLE); 
int morph_size = 6; 
Mat element = getStructuringElement(MORPH_RECT, 
            Size(2*morph_size+1, 2*morph_size+1), 
            Point(morph_size, morph_size)); 



Scalar color(255, 255, 255); // color of the contour in the 
//Draw the contour and rectangle 
for(int i = 0; i < contours.size(); i++) 
{ 
    drawContours(fgMaskMOG2, 
        contours, 
        i, 
        color, 
        CV_FILLED, 
        8, 
        hierarchy); 
} 

//imshow("morpho window",dst); 

vector<Moments> mu(contours.size()); 

vector<Point2f> mc(contours.size()); 
vector<Point2f> m ; 

vector<double> time; 
vector<Point2f> centroid(mc.size()); 

//vector< vector<Point> >::iterator itc = contours.begin(); 
// iterate through each contour. 
double time1[1000]; 

for(int i = 0; i < contours.size(); i++) 
{ 
    // Find the area of contour 
    double a = contourArea(contours[i], false); 

    if(a > 500) 
    { 
     mu[i] = moments(contours[i], false); 
     mc[i] = Point2f((mu[i].m10/mu[i].m00), (mu[i].m01/mu[i].m00)); 
     m.push_back(mc[i]); 
     Point2f diff; 
     double euclidian = 0; 
     for(int f = 0; f < m.size(); f++) 
     { 
      if(k == 1) 
      { 
       c[f].ce.push_back(m[f]); 
       cout << "cen" << c[f].ce << endl; 
       euclidian = 0; 

      } 
      else 
      { 
       c[f+1].ce.push_back(m[f]); 
       cout << "cent" << c[f+1].ce << endl; 

       diff = c[f].ce[f] - c[f-1].ce[f-1]; 

       euclidian = abs(sqrt((diff.x*diff.x) + (diff.y*diff.y))); 
       cout << "euclidian" << euclidian << endl; 
      } 
     } 
     cout << "\n centroid" << m << endl; 

     circle(fgMaskMOG2, 
       mc[i], 
       5, 
       Scalar(0, 0, 255), 
       1, 
       8, 
       0); 
    } 
} 

感谢提前:)

+0

如果它们正在水平移动(或其他)但距离相机相同的距离(最终是这样,因为您没有立体视觉),那么计算轮廓面积a和最佳拟合方式意味着相同的对象 –

+0

您需要找出一个算法来跟踪连续帧之间的单个车辆(即找到对应于同一对象的对)。对于灵感,你可以看看我在[这个问题]中做了什么(http://stackoverflow.com/questions/36254452/counting-cars-opencv-python-issue/36274515#36274515) –

回答

0

可以估算基于视频帧的运动车辆的速度只有在车辆和摄像机之间的近似距离在整个计算过程中不变,即车辆正在垂直于摄像机视野的直线上移动。因此,如果摄像头从侧面看,所有车辆将处于不同的距离,并且对于多辆车辆的计算将变得非常不准确。即使车辆会重叠,他们的分割也很困难。

有两种情况中,你的计算可以工作 -

  1. 首先,当相机从顶部看车辆上的垂直向下拍摄。在这种情况下,车辆颜色和道路颜色之间会有明显的差异。您可以使用多种方法分割出这些单个车辆,根据它们的功能标记它们,并使用这些功能识别下一帧中的车辆。这样您就可以获得单个车辆的位置,然后您可以根据算法预测速度。这些下面的链接,这将是有帮助的,用于分割驶出的车辆 -

How to define the markers for Watershed in OpenCV?

http://www.codeproject.com/Articles/751744/Image-Segmentation-using-Unsupervised-Watershed-Al

http://www.bogotobogo.com/python/OpenCV_Python/python_opencv3_Image_Watershed_Algorithm_Marker_Based_Segmentation.php

  • 其次,当车辆在一条线后面移动。在这种情况下,您可以根据车辆的背景使用基于颜色和轮廓的分段组合。分割后,您可以再次使用对象特征来识别下一帧中对象的位置。然后为这两种情况运行你的算法。
  • 如果您拥有完整的车辆视频序列,则可以自动在第一帧中分割出不同的车辆或手动识别它们,然后对这些识别的对象应用运动跟踪。您可以使用Opencv的motion analysis functionsobject tracking functions来这样做。因此,您将获得每个车架中所有履带车辆的位置。因此,您可以轻松运行并测试您的速度计算算法。