1. 程式人生 > 其它 >OpenCV 4.x API 詳解與C++例項-運動分析

OpenCV 4.x API 詳解與C++例項-運動分析

技術標籤:OpenCV 4.x API 詳解與C++例項OpenCV

第一節 運動分析

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位二進位制影象。
learningRate0到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;
}

在這裡插入圖片描述