OpenCV 4.x API 詳解與C++例項-運動分析
阿新 • • 發佈:2021-02-07
技術標籤: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位二進位制影象。 |
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;
}