3

ビデオから動くオブジェクトをマスクしたい。OpenCVにはBackgroundSubtractorsが組み込まれているので、時間を大幅に節約できる可能性があります。ただし、公式リファレンスによると、関数は次のとおりです。

void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1)

マスクfgmaskを出力する必要がありますが、出力しません。fgmask変数には、上記のメソッドを呼び出した後、代わりに「マスクの輪郭」が含まれます。それは変だ。私が欲しいのは、動くオブジェクトを表すために(たとえば)白い色で塗りつぶされた単純な閉じた領域です。どうすればそれができますか?

返信や推薦をいただければ幸いです。どうもありがとう。

これが私のコードです:

int main(int argc, char *argv[])
{
    cv::BackgroundSubtractorMOG2 bg = BackgroundSubtractorMOG2(30,16.0,false);
    cv::VideoCapture cap(0);
    cv::Mat frame, mask, _frame, _fmask;
    cvNamedWindow("mask", CV_WINDOW_AUTOSIZE);
    for(;;)
    {
        cap >> frame;
        bg(frame,fmask,-1);

        _frame = IplImage(frame);
        _fmask = IplImage(fmask);

        cvShowImage("mask", &_fmask);
        if(cv::waitKey(30) >= 0) break;
    }
    return 0;
}

出力ビデオのスナップショットは次のとおりです。 ここに画像の説明を入力してください

ps私の作業環境は、OSX10.8上のOpenCV2.4.3およびAppleLLVMコンパイラ4.1を備えたXCode4.5.2です。

4

1 に答える 1

8

前景の白いピクセルで塗りつぶされたオブジェクト全体を取得したい場合は、あなたの経験について教えてください。

私の質問は、上記のコードについて、カメラの前でより多くのモーションを生成すると、より多くの白いピクセルが得られるかどうかです。

はいの場合、要件について学ぶべき2つのパラメンターがあります。

1つ目はHistoryパラメーターです。コンストラクターBackgroundSubtractorMOG2(30,16.0、false);で30として構成しました。。このパラメータは、たとえば300に増やすことでテストできます。これにより、前景のオブジェクトのモーション履歴が維持されます。したがって、開始位置から300フレーム以内に完全に移動した場合は、オブジェクト全体が必要に応じて白いピクセルで覆われます。ただし、徐々に消去されます。したがって、100%のソリューションを提供することはできません。

2番目のパラメーターは学習率と呼ばれます。あなたが言及したコードでbg(frame、fmask、-1); ここで、-1は学習率です。0.0から1.0に設定でき、デフォルトは-1です。0に設定すると、ビデオの開始時にフレームの一部ではないオブジェクトに必要なものが得られます。この種のオブジェクトを「外部オブジェクト」と呼ぶことができます。白いピクセルで覆われた異物が発生します。

私が上で述べた情報からあなたのテストを調査し、あなたの経験を共有してください。

于 2012-12-18T05:31:00.340 に答える