2

Я хочу сосчитать автомобили от видео. После разницы кадров я получил изображение с серой шкалой или бинарное изображение. Я определил Область интереса для работы в определенной области кадров, значения пикселей транспортных средств, проходящих через Область интересов, выше 0 или даже выше 40 или 50, потому что они белые.Использование времени в OpenCV для обработки кадров и других задач

Моя идея заключается в том, что когда определенное количество пикселей за определенный промежуток времени (например, 1-2 секунды) являются белыми, тогда должно быть транспортное средство, так что я увеличиваю счетчик.

Я хочу, чтобы проверить, есть ли еще белые пиксели, ближайшие или нет, через 1-2 секунды. Если нет белых пикселей, это означает, что автомобиль прошел, и появится следующее транспортное средство, таким образом счетчик должен быть увеличен.

Один из способов, который пришел мне на ум, - подсчитать кадры видео и сохранить его в переменной No_of_frames. Затем, используя эту переменную, я думаю, что могу оценить пройденное время. Если значение переменной No_of_frames больше, то позволяет сказать 20, это означает, что прошло почти 1 секунду, если частота кадров видеоролика составляет 25-30 кадров в секунду.

Я использую Qt Creator с окнами 7 и OpenCV 2.3.1

Мой код что-то вроде:

   for(int i=0; i<matFrame.rows; i++) 
      { 
       for(int j=0;j<matFrame.cols;j++) 

       if (matFrame.at<uchar>(i,j)>100)//values of pixels greater than 100 
               //will be considered as white. 
        { 
         whitePixels++; 
        } 
       if()// here I want to use time. The 'if' statement must be like: 
       //if (total_no._of_whitepixels>100 && no_white_pixel_came_after 2secs) 
       //which means that a vehicle has just passed so increment the counter. 
        { 
         counter++;  
        } 
      } 

Любая другая идея для подсчета транспортных средств, лучше, чем у меня, будет приветствоваться , Заранее спасибо.

Для сегментации фона я использую следующий алгоритм, но он очень медленный, я не знаю почему. Весь код выглядит следующим образом:

// opencv2/video/background_segm.hpp OPENCV header file must be included. 
IplImage*  tmp_frame = NULL; 
CvCapture*  cap = NULL; 
bool update_bg_model = true; 

Mat element = getStructuringElement(0, Size(2,2),Point()); 
Mat eroded_frame; 
Mat before_erode; 
if(argc > 2) 
    cap = cvCaptureFromCAM(0); 

else 
// cap = cvCreateFileCapture("C:\\4.avi"); 
    cap = cvCreateFileCapture("C:\\traffic2.mp4"); 

if(!cap) 
{ 
    printf("can not open camera or video file\n"); 
    return -1; 
} 

tmp_frame = cvQueryFrame(cap); 
if(!tmp_frame) 
{ 
    printf("can not read data from the video source\n"); 
    return -1; 
} 

cvNamedWindow("BackGround", 1); 
cvNamedWindow("ForeGround", 1); 

CvBGStatModel* bg_model = 0; 

for(int fr = 1;tmp_frame; tmp_frame = cvQueryFrame(cap), fr++) 
{ 
    if(!bg_model) 
    { 
     //create BG model 
     bg_model = cvCreateGaussianBGModel(tmp_frame); 
     // bg_model = cvCreateFGDStatModel(temp); 
     continue; 
    } 

    double t = (double)cvGetTickCount(); 
    cvUpdateBGStatModel(tmp_frame, bg_model, update_bg_model ? -1 : 0); 
    t = (double)cvGetTickCount() - t; 
    printf("%d. %.1f\n", fr, t/(cvGetTickFrequency()*1000.)); 

    before_erode= bg_model->foreground; 
    cv::erode((Mat)bg_model->background, (Mat)bg_model->foreground, element); 
    //eroded_frame=bg_model->foreground; 
    //frame=(IplImage *)erode_frame.data; 

    cvShowImage("BackGround", bg_model->background); 
    cvShowImage("ForeGround", bg_model->foreground); 
    // cvShowImage("ForeGround", bg_model->foreground); 
    char k = cvWaitKey(5); 
    if(k == 27) break; 
    if(k == ' ') 
    { 
     update_bg_model = !update_bg_model; 
     if(update_bg_model) 
      printf("Background update is on\n"); 
     else 
      printf("Background update is off\n"); 
    } 
} 
cvReleaseBGStatModel(&bg_model); 
cvReleaseCapture(&cap); 
return 0; 
+0

Мне тоже нужен этот ответ! – Horizon1710

+0

В реальной жизни алгоритм, который вы описали, никогда не будет работать, поскольку автомобили могут иметь разные цвета и двигаться с разной скоростью. Можете ли вы рассказать нам немного о вашем прошлом? – guinny

ответ

2

Проведено много исследований по отслеживанию и подсчету транспортных средств. Подход, который вы описываете, кажется довольно хрупким и вряд ли будет надежным или точным. Основная проблема заключается в использовании количества пикселей выше определенного порога без учета их пространственной связности или временного отношения.

Различие кадров может быть полезно для отделения движущегося объекта от его фона, если объект, представляющий интерес, является единственным (или самым большим) движущимся объектом.

Вам действительно нужно сначала определить интересующий объект, отделить его от фона и отслеживать его с течением времени с помощью адаптивного фильтра (такого как фильтр Калмана). Посмотрите на OpenCV video reference. OpenCV обеспечивает вычитание фона и сегментацию объекта для выполнения всех необходимых шагов.

Предлагаю вам ознакомиться с OpenCV - Learning OpenCV - отличное чтение. А также по более общим алгоритмам компьютерного зрения и теории - http://homepages.inf.ed.ac.uk/rbf/CVonline/books.htm имеет хороший список.

+0

Спасибо за ваш ответ gavinb, оценил :) –

0

Обычно они просто помещают небольшую пневматическую трубу через дорогу (мягкая труба, заполненная воздухом). Он прикреплен к простому счетчику. Каждое транспортное средство, проходящее через трубу, генерирует два импульса (первый передний, затем задний колеса). Счетчик регистрирует количество импульсов в заданные временные интервалы и делит на 2, чтобы получить приблизительное количество транспортных средств.

+0

Это не ответ на вопрос, который был задан. – andrewsi

Смежные вопросы