2013-10-07 40 views
18

を使用する私は、このチュートリアルのPA OpenCV.orgを通過しようとしていた:MOGポインタがOpenCVの:どのようにcreateBackgroundSubtractorMOG

Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor 

とメインのように初期化されて

http://docs.opencv.org/trunk/doc/tutorials/video/background_subtraction/background_subtraction.html#background-subtraction

、それは

pMOG = createBackgroundSubtractorMOG(); 

ただし、このyie LDS次のエラー:

また
Error: Identifier "createBackgroundSubtractorMOG" is undefined 

、背景モデルを更新するとき、次のコマンドを使用している:

順番に次のエラー得
pMOG->apply(frame, fgMaskMOG); 

Error: class "cv::BackgroundSubtractor" has no member "apply" 

これについて何ができるのでしょうか? 事前に感謝します!私は今日、この問題を満たすために起こった

//opencv 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/video/background_segm.hpp> 
//C 
#include <stdio.h> 
//C++ 
#include <iostream> 
#include <sstream> 

using namespace cv; 
using namespace std; 

//global variables 
Mat frame; //current frame 
Mat fgMaskMOG; //fg mask generated by MOG method 
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method 
Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor 
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractor 
int keyboard; 

//function declarations 
void help(); 
void processVideo(char* videoFilename); 
void processImages(char* firstFrameFilename); 

void help() 
{ 
    cout 
    << "--------------------------------------------------------------------------" << endl 
    << "This program shows how to use background subtraction methods provided by " << endl 
    << " OpenCV. You can process both videos (-vid) and images (-img)."    << endl 
                        << endl 
    << "Usage:"                  << endl 
    << "./bs {-vid <video filename>|-img <image filename>}"       << endl 
    << "for example: ./bs -vid video.avi"           << endl 
    << "or: ./bs -img /data/images/1.png"           << endl 
    << "--------------------------------------------------------------------------" << endl 
    << endl; 
} 

int main(int argc, char* argv[]) 
{ 
    //print help information 
    help(); 

    //check for the input parameter correctness 
    if(argc != 3) { 
    cerr <<"Incorret input list" << endl; 
    cerr <<"exiting..." << endl; 
    return EXIT_FAILURE; 
    } 

    //create GUI windows 
    namedWindow("Frame"); 
    namedWindow("FG Mask MOG"); 
    namedWindow("FG Mask MOG 2"); 

    //create Background Subtractor objects 
    pMOG = createBackgroundSubtractorMOG(); //MOG approach 
    pMOG2 = createBackgroundSubtractorMOG2(); //MOG2 approach 

    if(strcmp(argv[1], "-vid") == 0) { 
    //input data coming from a video 
    processVideo(argv[2]); 
    } 
    else if(strcmp(argv[1], "-img") == 0) { 
    //input data coming from a sequence of images 
    processImages(argv[2]); 
    } 
    else { 
    //error in reading input parameters 
    cerr <<"Please, check the input parameters." << endl; 
    cerr <<"Exiting..." << endl; 
    return EXIT_FAILURE; 
    } 
    //destroy GUI windows 
    destroyAllWindows(); 
    return EXIT_SUCCESS; 
} 

void processVideo(char* videoFilename) { 
    //create the capture object 
    VideoCapture capture(videoFilename); 
    if(!capture.isOpened()){ 
    //error in opening the video input 
    cerr << "Unable to open video file: " << videoFilename << endl; 
    exit(EXIT_FAILURE); 
    } 
    //read input data. ESC or 'q' for quitting 
    while((char)keyboard != 'q' && (char)keyboard != 27){ 
    //read the current frame 
    if(!capture.read(frame)) { 
     cerr << "Unable to read next frame." << endl; 
     cerr << "Exiting..." << endl; 
     exit(EXIT_FAILURE); 
    } 
    //update the background model 
    pMOG->apply(frame, fgMaskMOG); 
    pMOG2->apply(frame, fgMaskMOG2); 
    //get the frame number and write it on the current frame 
    stringstream ss; 
    rectangle(frame, cv::Point(10, 2), cv::Point(100,20), 
       cv::Scalar(255,255,255), -1); 
    ss << capture.get(CAP_PROP_POS_FRAMES); 
    string frameNumberString = ss.str(); 
    putText(frame, frameNumberString.c_str(), cv::Point(15, 15), 
      FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0)); 
    //show the current frame and the fg masks 
    imshow("Frame", frame); 
    imshow("FG Mask MOG", fgMaskMOG); 
    imshow("FG Mask MOG 2", fgMaskMOG2); 
    //get the input from the keyboard 
    keyboard = waitKey(30); 
    } 
    //delete capture object 
    capture.release(); 
} 

void processImages(char* fistFrameFilename) { 
    //read the first file of the sequence 
    frame = imread(fistFrameFilename); 
    if(!frame.data){ 
    //error in opening the first image 
    cerr << "Unable to open first image frame: " << fistFrameFilename << endl; 
    exit(EXIT_FAILURE); 
    } 
    //current image filename 
    string fn(fistFrameFilename); 
    //read input data. ESC or 'q' for quitting 
    while((char)keyboard != 'q' && (char)keyboard != 27){ 
    //update the background model 
    pMOG->apply(frame, fgMaskMOG); 
    pMOG2->apply(frame, fgMaskMOG2); 
    //get the frame number and write it on the current frame 
    size_t index = fn.find_last_of("/"); 
    if(index == string::npos) { 
     index = fn.find_last_of("\\"); 
    } 
    size_t index2 = fn.find_last_of("."); 
    string prefix = fn.substr(0,index+1); 
    string suffix = fn.substr(index2); 
    string frameNumberString = fn.substr(index+1, index2-index-1); 
    istringstream iss(frameNumberString); 
    int frameNumber = 0; 
    iss >> frameNumber; 
    rectangle(frame, cv::Point(10, 2), cv::Point(100,20), 
       cv::Scalar(255,255,255), -1); 
    putText(frame, frameNumberString.c_str(), cv::Point(15, 15), 
      FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0)); 
    //show the current frame and the fg masks 
    imshow("Frame", frame); 
    imshow("FG Mask MOG", fgMaskMOG); 
    imshow("FG Mask MOG 2", fgMaskMOG2); 
    //get the input from the keyboard 
    keyboard = waitKey(30); 
    //search for the next image in the sequence 
    ostringstream oss; 
    oss << (frameNumber + 1); 
    string nextFrameNumberString = oss.str(); 
    string nextFrameFilename = prefix + nextFrameNumberString + suffix; 
    //read the next frame 
    frame = imread(nextFrameFilename); 
    if(!frame.data){ 
     //error in opening the next image in the sequence 
     cerr << "Unable to open image frame: " << nextFrameFilename << endl; 
     exit(EXIT_FAILURE); 
    } 
    //update the path of the current frame 
    fn.assign(nextFrameFilename); 
    } 
} 

答えて

35

:ここ

は全体のチュートリアルコードです。このチュートリアルでは、OpenCVの3.0のためではなく、OpenCVの2.4+のためである、次のようにいくつかの変更を行います。

//opencv 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/video/background_segm.hpp> 
//C 
#include <stdio.h> 
//C++ 
#include <iostream> 
#include <sstream> 

using namespace cv; 
using namespace std; 

//global variables 
Mat frame; //current frame 
Mat fgMaskMOG; //fg mask generated by MOG method 
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method 
Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor 
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractor 
int keyboard; 

//function declarations 
void help(); 
void processVideo(char* videoFilename); 
void processImages(char* firstFrameFilename); 

void help() 
{ 
    cout 
     << "--------------------------------------------------------------------------" << endl 
     << "This program shows how to use background subtraction methods provided by " << endl 
     << " OpenCV. You can process both videos (-vid) and images (-img)."    << endl 
     << endl 
     << "Usage:"                  << endl 
     << "./bs {-vid <video filename>|-img <image filename>}"       << endl 
     << "for example: ./bs -vid video.avi"           << endl 
     << "or: ./bs -img /data/images/1.png"           << endl 
     << "--------------------------------------------------------------------------" << endl 
     << endl; 
} 

int main(int argc, char* argv[]) 
{ 
    //print help information 
    help(); 

    //check for the input parameter correctness 
    if(argc != 3) { 
     cerr <<"Incorret input list" << endl; 
     cerr <<"exiting..." << endl; 
     return EXIT_FAILURE; 
    } 

    //create GUI windows 
    namedWindow("Frame"); 
    namedWindow("FG Mask MOG"); 
    namedWindow("FG Mask MOG 2"); 

    //create Background Subtractor objects 
    //NOTE HERE!!!! 
    pMOG= new BackgroundSubtractorMOG(); //MOG approach 
    pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach 

    if(strcmp(argv[1], "-vid") == 0) { 
     //input data coming from a video 
     processVideo(argv[2]); 
    } 
    else if(strcmp(argv[1], "-img") == 0) { 
     //input data coming from a sequence of images 
     processImages(argv[2]); 
    } 
    else { 
     //error in reading input parameters 
     cerr <<"Please, check the input parameters." << endl; 
     cerr <<"Exiting..." << endl; 
     return EXIT_FAILURE; 
    } 
    //destroy GUI windows 
    destroyAllWindows(); 
    return EXIT_SUCCESS; 
} 

void processVideo(char* videoFilename) { 
    //create the capture object 
    VideoCapture capture(videoFilename); 
    if(!capture.isOpened()){ 
     //error in opening the video input 
     cerr << "Unable to open video file: " << videoFilename << endl; 
     exit(EXIT_FAILURE); 
    } 
    //read input data. ESC or 'q' for quitting 
    while((char)keyboard != 'q' && (char)keyboard != 27){ 
     //read the current frame 
     if(!capture.read(frame)) { 
      cerr << "Unable to read next frame." << endl; 
      cerr << "Exiting..." << endl; 
      exit(EXIT_FAILURE); 
     } 
     //update the background model 
      //AND HERE!!! 
     pMOG->operator()(frame, fgMaskMOG); 
     pMOG2->operator()(frame, fgMaskMOG2); 
     //get the frame number and write it on the current frame 
     stringstream ss; 
     rectangle(frame, cv::Point(10, 2), cv::Point(100,20), 
      cv::Scalar(255,255,255), -1); 
     ss << capture.get(CV_CAP_PROP_POS_FRAMES); 
     string frameNumberString = ss.str(); 
     putText(frame, frameNumberString.c_str(), cv::Point(15, 15), 
      FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0)); 
     //show the current frame and the fg masks 
     imshow("Frame", frame); 
     imshow("FG Mask MOG", fgMaskMOG); 
     imshow("FG Mask MOG 2", fgMaskMOG2); 
     //get the input from the keyboard 
     keyboard = waitKey(30); 
    } 
    //delete capture object 
    capture.release(); 
} 

void processImages(char* fistFrameFilename) { 
    //read the first file of the sequence 
    frame = imread(fistFrameFilename); 
    if(!frame.data){ 
     //error in opening the first image 
     cerr << "Unable to open first image frame: " << fistFrameFilename << endl; 
     exit(EXIT_FAILURE); 
    } 
    //current image filename 
    string fn(fistFrameFilename); 
    //read input data. ESC or 'q' for quitting 
    while((char)keyboard != 'q' && (char)keyboard != 27){ 
     //update the background model 
      //ALSO HERE!!!! 
     pMOG->operator()(frame, fgMaskMOG); 
     pMOG2->operator()(frame, fgMaskMOG2); 
     //get the frame number and write it on the current frame 
     size_t index = fn.find_last_of("/"); 
     if(index == string::npos) { 
      index = fn.find_last_of("\\"); 
     } 
     size_t index2 = fn.find_last_of("."); 
     string prefix = fn.substr(0,index+1); 
     string suffix = fn.substr(index2); 
     string frameNumberString = fn.substr(index+1, index2-index-1); 
     istringstream iss(frameNumberString); 
     int frameNumber = 0; 
     iss >> frameNumber; 
     rectangle(frame, cv::Point(10, 2), cv::Point(100,20), 
      cv::Scalar(255,255,255), -1); 
     putText(frame, frameNumberString.c_str(), cv::Point(15, 15), 
      FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0)); 
     //show the current frame and the fg masks 
     imshow("Frame", frame); 
     imshow("FG Mask MOG", fgMaskMOG); 
     imshow("FG Mask MOG 2", fgMaskMOG2); 
     //get the input from the keyboard 
     keyboard = waitKey(30); 
     //search for the next image in the sequence 
     ostringstream oss; 
     oss << (frameNumber + 1); 
     string nextFrameNumberString = oss.str(); 
     string nextFrameFilename = prefix + nextFrameNumberString + suffix; 
     //read the next frame 
     frame = imread(nextFrameFilename); 
     if(!frame.data){ 
      //error in opening the next image in the sequence 
      cerr << "Unable to open image frame: " << nextFrameFilename << endl; 
      exit(EXIT_FAILURE); 
     } 
     //update the path of the current frame 
     fn.assign(nextFrameFilename); 
    } 
} 
+0

ありがとうございます! :) – Rickz0r

+0

それはうまくいけませんが、少なくともウェブカメラの前で人を追跡するためではないかもしれません。おそらく、路上などの人を追跡する方が良いでしょう。最初のフレームを忘れることは決してないようです。どのパラメータ値を使用しても、最初のフレームは定数マスクのようなものです。私は他の何も変更せずに私が使用していると仮定しています VideoCapture capture(0); の代わりに VideoCapture capture(videoFilename); – Rickz0r

+0

さて、私はそれを得た! 'pMOG-> operator()(frame、fgMaskMOG、0.1);' 0.0がなぜデフォルトになるのか、とにかく、私は今幸せです:) – Rickz0r

5

したがって前の回答にバックグラウンド減算ものように定義することができます。

BackgroundSubtractorMOG MOG; 

の代わりに、 :それはもう使用されていないとき

Ptr<BackgroundSubtractor> pMOG; 
pMOG= new BackgroundSubtractorMOG(); //MOG approach 

もpMOGを削除するために必要となること、さらにはファンクタは少し賢く方法で前景マスクを更新するために使用することができます:

MOG(newFrame, foregroundMask); 

insted:

pMOG->operator()(frame, fgMaskMOG); 

のOpenCVのデフォルトの仮定は、背景が非常に一定であり、任意の更新を必要としないということですので、学習初期段階の後にガウス分布の混合物が変更されませんこれ以上。詳細かつ明確な説明もここで見つけることができます。

http://hal.archives-ouvertes.fr/docs/00/33/82/06/PDF/RPCS_2008.pdf

+0

清めてくれてありがとう – Rickz0r

+0

Ptrよりずっときれいです上からのもの。ありがとう! – br1

+0

公式に推奨されるアプローチは、 'makePtr <>'または 'Algorithm :: create'を' new'ではなく ''使用することです。 [OpenCV 3 Transition Guide](http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html#tutorial_transition_algorithm)を参照してください。 – chappjc

1

私も同じ問題を持っていた: エラー:識別子「createBackgroundSubtractorMOGは、」私はOpenCVのライブラリへのリンクがありませんでしたので、だった未定義ですlibopencv_video.so私のアルゴリズムです。

私はlibopencv_videoを含むことでこれを解決しました。そうこのようなあなたののMakefileで行うことができますプロジェクトのリンク時: -L/usr/local/lib/libopencv_video.so

これは、エラーを解決して、私はここに与えられたとしてチュートリアルを使用することができる午前: http://docs.opencv.org/3.0-beta/doc/tutorials/video/background_subtraction/background_subtraction.html

+0

おかげさまで、正解(必要なビデオモジュールとのリンク)が今や提案されました。 +1 – chappjc

+0

しかし、現在のチュートリアル(3.1以降)の関数は 'createBackgroundSubtractorMOG2'であり、これはopencv2/video/background_segm.hppで偶然宣言されているため、どのモジュールをリンクするべきかをかなり明白にするはずです。 :) – chappjc

1

あなたはMOGの方法が仕事をしたい場合は、

#include "opencv2/bgsegm.hpp" 

、その後

べき
pMOG = bgsegm::createBackgroundSubtractorMOG(); 
関連する問題