如何在背景减法模型中使用捕获的视频播放和检测对象?

时间:2013-04-24 07:02:58

标签: visual-c++ opencv image-processing

大家!我使用的是opencv2.4.2。实际上我正在进行物体检测项目。我尝试使用BackgroundSubtractorMOG模型。            但我无法从我的电脑加载视频文件。在实时运行时,下面的分段代码工作正常。            我已经实现了使用帧差分方法进行对象检测。现在我想从背景中分割整个对象。我有静态背景。所以任何人都可以帮我下面的代码如何从捕获的视频中分割对象。还有如何加载视频文件?            谢谢。

  •       #include "stdafx.h"
          #include "opencv2/imgproc/imgproc.hpp"
           #include "opencv2/highgui/highgui.hpp"
           #include "opencv2/contrib/contrib.hpp"
           #include "conio.h"
    
          #include "time.h"
          #include "opencv/cvaux.hpp"
          #include "opencv2/core/core.hpp"
          #include "opencv2/calib3d/calib3d.hpp"
    
          using namespace std;
          using namespace cv;
      int main(int argc, char** argv)
     {
    //IplImage* tmp_frame;
    //std::string arg = argv[1];
    //VideoCapture capture();
          cv::VideoCapture cap;
    
           /*CvCapture *cap =cvCaptureFromFile("S:\\offline object detection                 database\\SINGLE PERSON Database\\video4.avi");
          if(!cap){
            printf("Capture failure\n");
             return -1;
            }
    
            IplImage* frame=0;
            frame = cvQueryFrame(cap);           
             if(!frame)
    return -1;*/
    
    
    
         bool update_bg_model = true;
    
        if( argc < 2 )
        cap.open(0);
        else
        cap.open(std::string(argv[1]));
    
        if( !cap.isOpened() )
       {
        printf("can not open camera or video file\n");
        return -1;
       }
    
        Mat tmp_frame, bgmask;
    
        cap >> tmp_frame;
        if(!tmp_frame.data)
        {
    
    
        printf("can not read data from the video source\n");
        return -1;
        }
    
         namedWindow("video", 1);
        namedWindow("segmented", 1);
    
        BackgroundSubtractorMOG bgsubtractor;
    
        for(;;)
       {
        //double t = (double)cvGetTickCount();
        cap >> tmp_frame;
        if( !tmp_frame.data )
            break;
        bgsubtractor(tmp_frame, bgmask, update_bg_model ? -1 : 0);
        //t = (double)cvGetTickCount() - t;
        //printf( "%d. %.1f\n", fr, t/(cvGetTickFrequency()*1000.) );
        imshow("video", tmp_frame);
        imshow("segmented", bgmask);
        char keycode = waitKey(30);
        if( keycode == 27 ) break;
        if( keycode == ' ' )
            update_bg_model = !update_bg_model;
         }
    
          return 0;
         }
    

1 个答案:

答案 0 :(得分:0)

opencv中的视频加载对我有用。要加载视频,您可以尝试这样的操作。捕获帧后,您可以在循环中进行处理,也可以调用单独的函数。

std::cout<<"Video File "<<argv[1]<<std::endl;

cv::VideoCapture input_video(argv[1]);

namedWindow("My_Win",1);

Mat cap_img;

while(input_video.grab())
{
   if(input_video.retrieve(cap_img))
   {
     imshow("My_Win", cap_img);
     /* Once you have the image do all the processing here */
     /* Or Call your image processing function */
     waitKey(1);

   }
}

或者你可以做点什么

int main(int argc, char*argv[])
{

    char *my_file = "C:\\vid_an2\\desp_me.avi";
    std::cout<<"Video File "<<my_file<<std::endl;
    cv::VideoCapture input_video;

    if(input_video.open(my_file))
    {
         std::cout<<"Video file open "<<std::endl;
    }
    else
    {
        std::cout<<"Not able to Video file open "<<std::endl;

    }
    namedWindow("My_Win",1);
    namedWindow("Segemented", 1);
    Mat cap_img;
    for(;;)
    {
         input_video >> cap_img;
         imshow("My_Win", cap_img);
          waitKey(0);
    }
   return 0;
 }