常見算法:1、圖像分割(GMM - 高斯混合模型),2、機器學習(KNN - K個最近鄰)
場景:主要運用在背景不變的場景下
代碼:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
VideoCapture capture;
capture.open("./video/video_003.avi");
//VideoCapture capture(0);
if(!capture.isOpened())
{
printf("[%s][%d]could not load video data...\n",__FUNCTION__,__LINE__);
return -1;
}
capture.set(CAP_PROP_FRAME_WIDTH, 320);
capture.set(CAP_PROP_FRAME_HEIGHT ,240);
double fps = capture.get(CAP_PROP_FPS);
printf("[%s][%d]fps = %f\n",__FUNCTION__,__LINE__,fps);
Size size = Size(capture.get(CAP_PROP_FRAME_WIDTH),capture.get(CAP_PROP_FRAME_HEIGHT));
cout << size << endl;
Mat frame;
Mat bsmaskMOG2;
Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
Mat bsmaskKNN;
Ptr<BackgroundSubtractor> pKNN = createBackgroundSubtractorKNN();
Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
while(capture.read(frame))
{
imshow("video-demo",frame);
moveWindow("video-demo",0,0);
pMOG2->apply(frame,bsmaskMOG2);
morphologyEx(bsmaskMOG2,bsmaskMOG2,MORPH_OPEN,kernel,Point(-1,-1));
imshow("MOG2",bsmaskMOG2);
moveWindow("MOG2",size.width+70,0);
pKNN->apply(frame,bsmaskKNN);
morphologyEx(bsmaskKNN,bsmaskKNN,MORPH_OPEN,kernel,Point(-1,-1));
imshow("KNN",bsmaskKNN);
moveWindow("KNN",size.width*2+70,0);
if(waitKey(33) == 27)
{
break;
}
}
capture.release();
waitKey(0);
return 0;
}
效果: