OpenCV 4.x API 详解与C++实例-运动分析

第一节 运动分析

OpenCV的video模块提供了KNN和MOG2的运动分析算法。

1、cv::createBackgroundSubtractorKNN


创建基于KNN算法的背景提取器。

Ptr cv::createBackgroundSubtractorKNN(int history = 500,double dist2Threshold = 400.0,bool detectShadows = true)

参数名称 参数描述
history 历史帧长度
dist2Threshold 像素与样本之间的平方距离的阈值,以确定像素是否接近该样本。 此参数不影响背景更新。
detectShadows 如果为true,则算法将检测阴影并对其进行标记。 它会稍微降低速度,因此,如果不需要此功能,请将参数设置为false。

类BackgroundSubtractorKNN继承了类BackgroundSubtractor,其中BackgroundSubtractor的apply为核心方法。其参数描述如下:

参数名称 参数描述
image 下一视频帧
fgmask 输出前景掩码为8位二进制图像。
learningRate 0到1之间的值指示学习背景模型的速度。 负参数值使算法使用一些自动选择的学习速率。 0表示完全不更新背景模型,1表示从最后一帧完全重新初始化背景模型。
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;

int main()
{
    // 打开摄像头或视频
    cv::VideoCapture cap("videos/vtest.avi");
    if(!cap.isOpened()){
        cerr << "cannot open camera.\n";
        return EXIT_FAILURE;
    }

    // 创建背景提取器
    cv::Ptr<cv::BackgroundSubtractorKNN> backgroundSubtractorKNN = cv::createBackgroundSubtractorKNN();

    cv::Mat frame,fgmask,backgroundImage;
    while(cap.isOpened()){
        cap >> frame;
        if(frame.empty()){
            cerr << "cannot grab frame from camera.\n";
            break;
        }
        // 执行前景和背景分离
        backgroundSubtractorKNN->apply(frame,fgmask);
        // 获取背景图像
        backgroundSubtractorKNN->getBackgroundImage(backgroundImage);

        cv::imshow("camera",frame);
        cv::imshow("fgmask",fgmask);
        cv::imshow("background",backgroundImage);

        if(cv::waitKey(10) == 27){
            break;
        }
    }
    cv::destroyAllWindows();
    return 0;
}

在这里插入图片描述

2、cv::createBackgroundSubtractorMOG2


创建基于MOG2算法的背景提取器。

Ptr cv::createBackgroundSubtractorMOG2(int history = 500,double varThreshold = 16,bool detectShadows = true)

参数如下:

参数名称 参数描述
history 历史帧长度
varThreshold 像素与模型之间的Mahalanobis距离平方的阈值,以确定背景模型是否很好地描述了像素。 此参数不影响背景更新。
detectShadows 如果为true,则算法将检测阴影并对其进行标记。 它会稍微降低速度,因此,如果不需要此功能,请将参数设置为false。
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;

int main()
{
    // 打开摄像头或视频
    cv::VideoCapture cap("videos/vtest.avi");
    if(!cap.isOpened()){
        cerr << "cannot open camera.\n";
        return EXIT_FAILURE;
    }

    // 创建背景提取器
    cv::Ptr<cv::BackgroundSubtractorMOG2> backgroundSubtractor = cv::createBackgroundSubtractorMOG2();

    cv::Mat frame,fgmask,backgroundImage;
    while(cap.isOpened()){
        cap >> frame;
        if(frame.empty()){
            cerr << "cannot grab frame from camera.\n";
            break;
        }
        // 执行前景和背景分离
        backgroundSubtractor->apply(frame,fgmask);
        // 获取背景图像
        backgroundSubtractor->getBackgroundImage(backgroundImage);

        cv::imshow("camera",frame);
        cv::imshow("fgmask",fgmask);
        cv::imshow("background",backgroundImage);

        if(cv::waitKey(10) == 27){
            break;
        }
    }
    cv::destroyAllWindows();
    return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wujuxKkoolerter/article/details/113728362
今日推荐