0

私は前景の物体を検出するためのビデオ処理プロジェクトに取り組んでいます。以下は、前景と背景を分離するために使用される私のコードの一部です。

#include "opencv2/core/core.hpp"
#include "opencv2/video/background_segm.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdio.h>

using namespace std;
using namespace cv;


//this is a sample for foreground detection functions
int main(int argc, const char** argv)
{


    VideoCapture cap;
    bool update_bg_model = true;

    cap.open(0);


    if( !cap.isOpened() )
    {
        printf("can not open camera or video file\n");
        return -1;
    }

    namedWindow("image", CV_WINDOW_NORMAL);
    namedWindow("foreground mask", CV_WINDOW_NORMAL);
    namedWindow("foreground image", CV_WINDOW_NORMAL);
    namedWindow("mean background image", CV_WINDOW_NORMAL);

    BackgroundSubtractorMOG2 bg_model;
    Mat img, fgmask, fgimg;

    for(;;)
    {
        cap >> img;

        if( img.empty() )
            break;

        if( fgimg.empty() )
          fgimg.create(img.size(), img.type());

        //update the model
        bg_model(img, fgmask, update_bg_model ? -1 : 0);

        fgimg = Scalar::all(0);
        img.copyTo(fgimg, fgmask);

        Mat bgimg;
        bg_model.getBackgroundImage(bgimg);

        imshow("image", img);
        imshow("foreground mask", fgmask);
        imshow("foreground image", fgimg);
        if(!bgimg.empty())
          imshow("mean background image", bgimg );

        char k = (char)waitKey(30);
        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");
        }
    }

    return 0;
}

前景マスクウィンドウでは、実際の前景オブジェクトと一緒に多くのノイズが発生しています。また、fulllオブジェクトはフォアグラウンドとして認識されます。前景オブジェクトも長方形でバインドする必要があります。Wil BoundRect()は、前景マスクで輪郭を描画する場合に機能しますか?...また、輪郭を検索するときに渡される最も推奨されるパラメーター(findcontour())とBoundRect関数について...事前に感謝します

4

1 に答える 1

2

答えるには遅すぎますが、これが他の誰かに役立つことを願っています。

ビデオの背景から前景を (背景に制約なしで) ピクセル パーフェクトな方法で分離することは、非常に難しい問題です。この分野には多くの研究が行われており、まだ可能性があります。そのため、単純なガウス分布 (BackgroundSubtractorMOG2 で使用されている) では、非常に正確な結果が得られない場合があります。MOG の決定は色の手がかりに基づいており、背景の一部のピクセルがそれによって作成されたガウス モデルに適合する可能性があるため、ノイズはほとんど避けられません。

前景として得られるこれらのピクセルは、効果的に変化を表しています。したがって、背景モデルの学習率を調整すると、移動しているピクセルを詳細に追跡できます。背景がかなり静的であるという仮定の下で作業できる場合、移動するピクセルが前景を表し、問題をある程度解決するのに役立ちます。

また、openCV で BackgroundSubtractorGMG 関数を使用することをお勧めします。この関数は、最初の数フレーム (数は設定可能) から背景モデルを学習します。可能であれば、これらの最初の数フレームを前景にしないでください。まともな結果を得ることができます。

于 2014-07-13T04:57:34.607 に答える