最初のセクションのモーション分析
OpenCVのビデオモジュールは、KNNおよびMOG2モーション分析アルゴリズムを提供します。
1、cv :: createBackgroundSubtractorKNN
KNNアルゴリズムに基づいてバックグラウンドエクストラクタを作成します。
Ptr cv :: createBackgroundSubtractorKNN(int history = 500、double dist2Threshold = 400.0、booldetectShadows = true)
パラメータ名 | パラメータの説明 |
---|---|
歴史 | 履歴フレームの長さ |
dist2Threshold | ピクセルがサンプルに近いかどうかを判断するための、ピクセルとサンプル間の距離の2乗のしきい値。このパラメーターは、バックグラウンド更新には影響しません。 |
detectShadows | trueの場合、アルゴリズムは影を検出してマークを付けます。少し遅くなるので、この機能が必要ない場合は、パラメータをfalseに設定してください。 |
クラスBackgroundSubtractorKNNは、クラスBackgroundSubtractorを継承します。このクラスでは、BackgroundSubtractorの適用がコアメソッドです。パラメータは次のように説明されています。
パラメータ名 | パラメータの説明 |
---|---|
画像 | 次のビデオフレーム |
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、booldetectShadows = true)
パラメータは次のとおりです。
パラメータ名 | パラメータの説明 |
---|---|
歴史 | 履歴フレームの長さ |
varThreshold | 背景モデルがピクセルを適切に記述しているかどうかを判断するための、ピクセルとモデルの間のマハラノビス距離の2乗のしきい値。このパラメーターは、バックグラウンド更新には影響しません。 |
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;
}