ビデオから車両を数えたいと思う。フレーム差分の後、私はグレースケール画像または種類のバイナリ画像を得ました。私は、フレームの特定の領域で作業するために関心領域を定義しました。関心領域を通過する車両のピクセルの値は、白であるため、0より高く、さらには40または50より高くなります。OpenCVでフレーム処理や他のタスクのために時間を使う
私の考えは、特定の時間間隔(例えば1〜2秒)内の特定の数のピクセルが白である場合、ビークルが通過する必要があるのでカウンタをインクリメントするということです。
私が欲しいのは、白いピクセルがまだ1-2秒後に出てくるかどうかを調べることです。白いピクセルが来ない場合、それは車両が通過したことを意味し、次の車両が来ることを意味する。このようにして、カウンタをインクリメントしなければならない。
私の頭に浮かべた1つの方法は、ビデオのフレームを数え、それをNo_of_framesという変数に格納することです。その変数を使って、私は時間が過ぎたと推測できると思う。変数No_of_framesの値が20を超えると、ビデオフレームレートが25〜30 fpsの場合、ほぼ1秒が経過したことを意味します。
私は私のコードのようなものである7とOpenCVの2.3.1窓のQt Creatorの使用しています
:
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