第一节 运动分析
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;
}