4

OpenCVを使用した効率的な背景減算(ビデオファイルではなくカメラを除く、色付きの前景による背景減算)で言われていることのほとんどを作成する必要があります。問題は、そのトピックではバックグラウンド減算フェーズ自体に関する説明がないことです。

公式のopenCVブックとインターネットを見てきましたが、単純なフレーム差分では必要なものには十分ではありません. より精巧な Averaging Background Methodを理解しようとしましたが、平均を取得するためにフレームのcvAccの後で迷子になりました :/

誰かが私を少し助けることができれば、本当に感謝しています..

ありがとう!

私が今持っているコードで編集:

cvCvtScale( currentFrame, currentFloat, 1, 0 ); 
if(totalFrames == 0) 
 cvCopy(currentFloat, sum); 
else 
 cvAcc(currentFloat, sum);

平均

cvConvertScale( sum, imgBG, (double)(1.0/totalFrames) );

適応された背景(#define でアルファが 0.05 の場合)

cvRunningAvg(currentFrame, imgBG, alpha); 

前景のみで最終イメージを作成する(完璧とはほど遠い!)

void createForeground(IplImage* imgDif,IplImage * currentFrame)
{
cvCvtColor(imgDif, grayFinal, CV_RGB2GRAY);
cvSmooth(grayFinal, grayFinal);
cvThreshold(grayFinal, grayFinal, 40, 255, CV_THRESH_BINARY);

unsigned char *greyData= reinterpret_cast<unsigned char *>(grayFinal->imageData);
unsigned char *currentData= reinterpret_cast<unsigned char *>(currentFrame->imageData);
unsigned char *fgData= reinterpret_cast<unsigned char *>(currentFrame->imageData);

int i=0;
for(int j=0 ; j<(grayFinal->width*grayFinal->height) ; j++)
{
        if(greyData[j]==0) 
        {
            fgData[i]=0;
            fgData[i+1]=0;
            fgData[i+2]=0;
            i=i+3;
        }
        else 
        {
            fgData[i]= currentData[i];
            fgData[i+1]= currentData[i+1];
            fgData[i+2]= currentData[i+2];
            i=i+3;
        }
}
cvSetData( imgFG , fgData , imgFG->width*imgFG->nChannels);
}

今すぐ問題!

現在の最大の問題は、写真のどこかに電球がある場合、手を「上」に数秒間置いた後、手を離すと、光が長時間前景にとどまることです。 .これについて何か助けはありますか?

4

2 に答える 2

4

単純な背景減算 (前景抽出) メソッド。

1.ビデオの背景が静的である場合(つまり、背景の小さな変化がほぼ一定の背景である場合)、Nフレーム数を考慮して平均化します。次に、Uは背景画像を取得できますImg_BG.

    Img_BG = (1/N)*sum(framesFrom1 to N);

2.照明が時々変化するビデオの場合、背景画像は次のように更新されます。これは、実行中の平均と呼ばれます。

    Img_ApdatedBG =(1- alpha)*Img_BG+(alpha)*CurrentFrame;
    Img_BG =  Img_ApdatedBG;

alpha は現在のフレームに与える重みで、通常は約 0.05 から 0.1 です。この方法は、1 つの方法と比較してメモリ使用量が少なくなります。

3.背景画像は、median of N frames.

于 2012-05-29T05:43:58.123 に答える
3

Mixture of Gaussiansを使用して、このバックグラウンド減算の実装を試すことができます。wiki では、各ステップで使用される OpenCV 関数について説明しています。

これは、光の変化やシーンに出入りするオブジェクトを処理する堅牢なバックグラウンド減算方法です。

これが役立つことを願っています。

于 2012-05-29T07:16:54.583 に答える