使用OpenCV c ++进行运动检测

时间:2014-01-20 09:32:15

标签: c++ opencv motion-detection

我正在尝试使用我的网络摄像头和OpenCV。 我按照这个tuto:http://mateuszstankiewicz.eu/?p=189。 但我唯一的结果是一个红色边框,我不明白为什么。任何人都可以帮助我做正确的事并解决这个问题吗?

这是我的代码:

#include "mvt_detection.h"


Mvt_detection::Mvt_detection()
{

}

Mvt_detection::~Mvt_detection()
{
}

cv::Mat Mvt_detection::start(cv::Mat frame)
{
    cv::Mat back;
    cv::Mat fore;
    cv::BackgroundSubtractorMOG2 bg(5,3,true) ;
    cv::namedWindow("Background");
    std::vector<std::vector<cv::Point> > contours;

    bg.operator ()(frame,fore);
    bg.getBackgroundImage(back);
    cv::erode(fore,fore,cv::Mat());
    cv::dilate(fore,fore,cv::Mat());
    cv::findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
    cv::drawContours(frame,contours,-1,cv::Scalar(0,0,255),2);
    return frame;
}

以下是我们的cam返回的屏幕截图: enter image description here

我尝试了来自therethere的另外两个视频,并且存在同样的问题。

感谢您的帮助:)。

3 个答案:

答案 0 :(得分:0)

我使用了以下与您类似的代码,但它运行良好。我也从网络摄像头那里获取输入信息。在你的代码中,我没有找到任何imshow()和waitkey。尝试使用它们。我的代码如下:

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

#include <iostream>
#include <vector>

using namespace std;
using namespace cv;

int main()
{

    VideoCapture cap;
    bool update_bg_model = true;

    cap.open(0);
    cv::BackgroundSubtractorMOG2 bg;//(100, 3, 0.3, 5);
    bg.set ("nmixtures", 3);
    std::vector < std::vector < cv::Point > >contours;

    cv::namedWindow ("Frame");
    cv::namedWindow ("Background");

    Mat frame, fgmask, fgimg, backgroundImage;

    for(;;)
    {
        cap >> frame;
        bg.operator()(frame, fgimg);
        bg.getBackgroundImage (backgroundImage);
        cv::erode (fgimg, fgimg, cv::Mat ());
        cv::dilate (fgimg, fgimg, cv::Mat ());

        cv::findContours (fgimg, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
        cv::drawContours (frame, contours, -1, cv::Scalar (0, 0, 255), 2);

        cv::imshow ("Frame", frame);
        cv::imshow ("Background", backgroundImage);


        char k = (char)waitKey(30);
        if( k == 27 ) break;

    }

    return 0;
}

答案 1 :(得分:0)

问题已解决,将BackgroundSubtractorMOG2放在我的对象的字段中并在构造函数中初始化它使他运行良好。

答案 2 :(得分:0)

正如@Lenjyco所说,我们解决了这个问题。

@Micka有一个好主意:

首先,BackgroundSubtractorMOG2仅在ONCE上进行实例化。

我们在构造函数中实例化它并与Hystory和Threashold一起玩:

Mvt_detection::Mvt_detection()
{
    bg = new cv::BackgroundSubtractorMOG2(10, 16, false);
}
  

10:背景回顾比较的图像数量。

     

16:阈值水平(模糊)

这样,我们现在能够检测到运动。

谢谢!