使用 opencv 仅检测缓慢移动的物体

Posted

技术标签:

【中文标题】使用 opencv 仅检测缓慢移动的物体【英文标题】:detecting only slow moving objects using opencv 【发布时间】:2014-04-26 09:33:55 【问题描述】:

我正在使用 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;
    

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

我确实试过了,但在这种情况下,它可以捕捉慢速和快速运动。 您可以计算两个阈值并减去这两个阈值,以便在这种情况下仅获得慢速阈值的运动。【参考方案2】:

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

参见addWeighted 和moving Average(参见累积移动平均线)。

集成将减少快速变化的影响。

【讨论】:

以上是关于使用 opencv 仅检测缓慢移动的物体的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-Python视频分析(移动物体检测,物体追踪)

如何检测物体边框 opencv

结合背景减法和光流

如何在 Flutter 插件中添加 OpenCV

如何定义阈值以仅检测图像中的绿色对象:Opencv [重复]

Opencv 3.0 加载人脸级联时出错