使用opencv仅检测缓慢移动的对象

时间:2014-04-26 09:33:55

标签: c++ opencv image-processing motion-detection

我正在使用OpenCV进行运动检测,并使用背景减法算法。我从网上获得了以下代码。

cv::Mat frame;
    cv::Mat back;
    cv::Mat fore;
    cv::VideoCapture cap(0);
    bg.nmixtures = 3;
    bg.bShadowDetection = false;
const int history = 5;
cv::BackgroundSubtractorMOG2 bg (history,nmixtures,bShadowDetection);

    std::vector<std::vector<cv::Point> > contours;

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

    for(;;)
    {
        cap >> frame;
        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);
        cv::imshow("Frame",frame);
        cv::imshow("Background",back);
        if(cv::waitKey(30) >= 0) break;
    }

我可以设置一个阈值,这样如果新旧框架的变化超过阈值,那么就不要做任何事情。或者可能是一些其他算法应该适合我只捕获慢速移动物体的情况。

2 个答案:

答案 0 :(得分:0)

如果您想要检测慢速移动的物体,可以在高斯模型的混合中更改历史值(增加它)。

答案 1 :(得分:0)

您可以尝试使用帧的移动平均值,而不是使用每一帧作为BG减法的输入。或者使用移动平均值输出BG减法,然后通过阈值化进行二值化。

请参阅addWeightedmoving Average(参见累积移动平均线)。

整合将减少快速变化的影响。