2

ビデオから車両を数えたいと思う。フレーム差分の後、私はグレースケール画像または種類のバイナリ画像を得ました。私は、フレームの特定の領域で作業するために関心領域を定義しました。関心領域を通過する車両のピクセルの値は、白であるため、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; 
+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つのパルス(第1のフロント、その後のホイール)を生成する。カウンタは、指定された時間間隔でパルスの数を記録し、およその車両数を得るために2で除算します。

+0

これは質問された質問に対する答えではありません。 – andrewsi

関連する問題