对视频的操作是把视频读成一张张的图片,在图片的基础上进行操作。图片背景的消除就是图像的分割。这里用高斯混合和KNN两种方法进行操作,具体的数学原理可以参考其他博客。
下面是代码演示:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
VideoCapture capture("E:\\video.avi");
if (!capture.isOpened())
{
printf("not open");
}
Mat frame;
Mat bsmaskMOG2;
Mat knn;
namedWindow("input_video", WINDOW_AUTOSIZE);
namedWindow("MOG2", WINDOW_AUTOSIZE);
namedWindow("knn", WINDOW_AUTOSIZE);
Ptr<BackgroundSubtractor>pMOG2 = createBackgroundSubtractorMOG2();//自适应混合高斯方法
Ptr<BackgroundSubtractor>KNN = createBackgroundSubtractorKNN();//knn方法
while (capture.read(frame))
{
imshow("input_video", frame);
pMOG2->apply(frame, bsmaskMOG2);
KNN->apply(frame, knn);
imshow("MOG2", bsmaskMOG2);
imshow("knn", knn);
char c = waitKey(100);
if (c == 27)
{
break;
}
}
waitKey(0);
return 0;
}
显示效果:
。
这里的显示的效果并不是很好,有很多噪声。下一篇博客中将使用滤波和形态学操作,来获得更好的显示效果。