Я хочу сосчитать автомобили от видео. После разницы кадров я получил изображение с серой шкалой или бинарное изображение. Я определил Область интереса для работы в определенной области кадров, значения пикселей транспортных средств, проходящих через Область интересов, выше 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;
Мне тоже нужен этот ответ! – Horizon1710
В реальной жизни алгоритм, который вы описали, никогда не будет работать, поскольку автомобили могут иметь разные цвета и двигаться с разной скоростью. Можете ли вы рассказать нам немного о вашем прошлом? – guinny