2011-01-31 17 views
0

ビデオフレームからフォアグラウンドを抽出する際に問題があります。 バックグラウンドオブジェクトもほとんど抽出されません。サンプルビデオからスナップショットを取ってバックグラウンドイメージとして使用しました.Suggestは何をすべきですか?私はビデオからスナップショットを取るのではなく、仮定すると、スナップショットは、画像より低い解像度のものである)、または抽出に使用されるいくつかの他のよりよいcode.Theコードはopencv C++とMS VS2010を使用したフォアグラウンド抽出の問題

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    IplImage *frame = NULL; 
    IplImage *img1 = NULL; 

    IplImage *grey = NULL; 
    IplImage *edges = NULL; 
     int delay = 0, key=0, i=0; 
    CvCapture *video = NULL; 
    CvCapture *video1 = NULL; 

     cvNamedWindow("window_name"); 

     video = cvCreateFileCapture("sample.avi"); 
     video1 = cvCreateFileCapture("sample.avi"); 


    frame = cvQueryFrame(video); 
    img1 = cvQueryFrame(video1); 
     grey = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); 
     edges = cvCreateImage(cvGetSize(img1), IPL_DEPTH_8U, 1); 

    cvShowImage("backgrnd", img1); 

//get height and width using OpenCV functions 
const int &rows = img1->width; 
const int &cols =frame->height; 
    BYTE *Pixel2=0; 
    cvGetRawData(img1,&Pixel2,0,0); 
     while (frame) { 


BYTE *Pixel1=0; 
//extract pixels using the OpenCV function cvGetRawData 

cvGetRawData(frame,&Pixel1,0,0); 

//register int to increase the speed 
register int r,ri,c; 

//to find diffrence of 2 images by pixel to pixel comparision 
for(r = 0, ri = 0; r < rows*3; r++, ri += cols) 
{ 
    for(c = 0; c < cols; c++) 
     { 
      //get the difference in pixels 
      Pixel1[ri + c] = Pixel1[ri + c] - Pixel2[ri + c]; 

      //set threshold value as 100 for comparision, it can be changed to values between 50 and 200, for getting binary image 
      if(Pixel1[ri + c] < 150) 
       { 
        Pixel1[ri + c]=0; 
       } 
      else 
        Pixel1[ri + c]=255; 

     }//for c 

}//for r, ri 
Return 0; 
} 
+0

コードをフォーマット/インデントする方法を学んでください –

+0

また、入出力スクリーンショットも投稿できますか?コードが期待していることを想像するのは難しいです。 –

答えて

0

前景/背景分割深い、難しい問題です。最初に最も重要なことは、「背景とは対照的に前景の定義は何ですか?」ということです。時間の経過とともに背景が大きく変化し、前景/背景のセグメンテーションが特に困難になることがあります。あなたの答えに応じて、非常にうまくいく様々な方法があります。あるものは、統計的に性質があり、与えられたピクセルでの色の確率分布を扱うか、画像から抽出された特徴を扱う。一部の人は、ビデオ内のフィーチャを追跡し、さまざまな移動フィーチャのダイナミクスに基づいてイメージをセグメント化しようとします。さらに他のものは、主成分分析の変形に基づいて、性質上より代数的である。そこには数多くの良いアルゴリズムがあり、最近誰もフレーム差分を使用していません。

OpenCVを使用している場合は、新鮮なOpenCV2.2を保留することを強くおすすめします。 videoモジュールのOpenCV2.2には、フォアグラウンド/バックグラウンドセグメンテーションのためのいくつかの素晴らしいツールがあります。コード内のドキュメントは、さまざまなアルゴリズムの背後にある理論を説明する文献や論文を紹介します。

あなたに最高の運があります!

関連する問題