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

Visual c++ 如何在背景减法器模型中使用捕获的视频播放和检测对象?,visual-c++,opencv,image-processing,Visual C++,Opencv,Image Processing,大家好。!我正在使用opencv2.4.2。实际上我正在做一个关于物体检测的项目。我试着使用背景模型。 但我无法从我的计算机加载视频文件。在实时运行时,下面的代码可以很好地进行分段。 我已经实现了使用帧差分方法进行目标检测。现在我想从背景中分割出整个物体。我有静态背景。所以,有谁能在下面的代码中帮助我如何从捕获的视频中分割对象。还有如何加载视频文件? 多谢各位 #包括“stdafx.h” #包括“opencv2/imgproc/imgproc.hpp” #包括“opencv2/highgui/

大家好。!我正在使用opencv2.4.2。实际上我正在做一个关于物体检测的项目。我试着使用背景模型。 但我无法从我的计算机加载视频文件。在实时运行时,下面的代码可以很好地进行分段。 我已经实现了使用帧差分方法进行目标检测。现在我想从背景中分割出整个物体。我有静态背景。所以,有谁能在下面的代码中帮助我如何从捕获的视频中分割对象。还有如何加载视频文件? 多谢各位

  • #包括“stdafx.h”
    #包括“opencv2/imgproc/imgproc.hpp”
    #包括“opencv2/highgui/highgui.hpp”
    #包括“opencv2/contrib/contrib.hpp”
    #包括“conio.h”
    #包括“time.h”
    #包括“opencv/cvaux.hpp”
    #包括“opencv2/core/core.hpp”
    #包括“opencv2/calib3d/calib3d.hpp”
    使用名称空间std;
    使用名称空间cv;
    int main(int argc,字符**argv)
    {
    //IplImage*tmp_框架;
    //std::string arg=argv[1];
    //视频捕获();
    cv::视频捕获帽;
    /*CvCapture*cap=cvCaptureFromFile(“S:\\offline object detection database\\SINGLE PERSON database\\video4.avi”);
    如果(!cap){
    printf(“捕获失败\n”);
    返回-1;
    }
    IplImage*frame=0;
    框架=cvQueryFrame(cap);
    如果(!帧)
    返回-1*/
    bool update_bg_model=true;
    如果(argc<2)
    上限开放(0);
    其他的
    cap.open(std::string(argv[1]);
    如果(!cap.isOpened())
    {
    printf(“无法打开相机或视频文件”);
    返回-1;
    }
    Mat tmp_框架,bgmask;
    cap>>tmp_框架;
    如果(!tmp_frame.data)
    {
    printf(“无法从视频源读取数据\n”);
    返回-1;
    }
    namedWindow(“视频”,1);
    名称(“分段”,1);
    背景减法器MOG BG减法器;
    对于(;;)
    {
    //双t=(双)cvGetTickCount();
    cap>>tmp_框架;
    如果(!tmp_frame.data)
    打破
    bg减法器(tmp_帧、bg掩码、更新_bg_模型?-1:0);
    //t=(双)cvGetTickCount()-t;
    //printf(“%d.%.1f\n”,fr,t/(cvGetTickFrequency()*1000.);
    imshow(“视频”,tmp_帧);
    imshow(“分段”,bgmask);
    char-keycode=waitKey(30);
    如果(keycode==27)中断;
    如果(键代码=“”)
    更新_bg_模型=!更新_bg_模型;
    }
    返回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);
      
         }
      }
      

      std::couthi..谢谢你的回复。但实际上它并没有打开一个视频文件。正如您在我的代码中看到的:for(;){//double t=(double)cvGetTickCount();cap>>tmp_frame;//它在“>>中给出了错误这行。不知道为什么。使用MAt定义播放视频还有其他方法吗?或者有错误吗?请指导我。谢谢。上面的代码对我有效,我可以加载视频并播放它。我认为你应该检查正在加载的文件名。它是正确的文件吗。在windows上,你还需要使用\\而不是of\.e.g const char*my\u file=“C:\\my\u Folder\\my\u file.mpg”:类似的东西我也试过你的代码,但不是所有的东西都是文件打开部分和帧读取。它对我有效,我觉得你可以看看你传递的文件名。正如我在windows上说的,你需要使用双斜杠“\”作为文件夹分隔符。您好:@praks411;我运行了上面的代码。它对笔记本电脑摄像头工作正常。对于实时应用程序来说是指。但正如您所说,我也尝试过使用const char,但在:cap>>tmp_frame;和关闭应用程序时出现了错误。不知道如何加载?您可以参考我新编辑的代码,如果您能够成功打开文件,那么它会出错uld工作。上面的代码在VisualStudio2010 OpenCV2_4_3上对我有效
      
      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;
       }