opencv--背景建模(BSM)

本文介绍了一种在背景不变场景下进行图像分割的方法,利用OpenCV库中的GMM(高斯混合模型)和KNN(K个最近邻)算法,通过实例代码展示了如何从视频中实时提取前景目标。

常见算法: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;
}

效果:

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值