运动目标检测

#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
#include <iostream>
#include <sstream>
using namespace cv;
using namespace std;
Ptr<BackgroundSubtractorMOG2> pBackgroundKnn;
// MOG2目标建模检测
std::vector<cv::Rect> get_foreground_objects(cv::Mat scene,
	double scale, bool isFlag) 
{	
	// 标志位控制当前检测图像是否开启背景建模
	if (isFlag == false)
	{
		std::vector<cv::Rect> one_rect;
		cv::Rect whole;
		whole.x = whole.y = 0;
		whole.height = scene.rows;
		whole.width = scene.cols;
		one_rect.push_back(whole);
		return one_rect;
	}
	cv::Mat img;
	// 图像尺寸缩放 
	cv::resize(scene, img, cv::Size(0, 0), scale, scale);
	cv::Mat fgmask, fgimg, bgimg;
	// 更新背景模型
	pBackgroundKnn->apply(img, fgmask);
	// 中值滤波
	cv::medianBlur(fgmask,fgmask, 5);
	// cv::imshow("fgmask",fgmask);
    // 形态学闭操作
	cv::morphologyEx(fgmask, fgmask, cv::MORPH_CLOSE,
		cv::Mat::ones(15, 3, CV_8UC1));
	// 找到连通域
	std::vector<std::vector<cv::Point> > region_contours;
	cv::findContours(fgmask, region_contours, CV_RETR_EXTERNAL,
		CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
	std::vector<cv::Rect> objects;
	
	// 输出检测连通域最小矩形
	for (size_t i = 0; i != region_contours.size(); ++i)
	{
		cv::Rect rect = cv::boundingRect(region_contours[i]);
		//对检测得到的外界矩形区域进行缩放
		rect.y += rect.height * 1 / 4;
		rect.height *= 3 / 4.0;
		rect.x /= scale;
		rect.width /= scale;
		rect.y /= scale;
		rect.height /= scale;
		if (rect.area() > scene.total() /400)
		{
			objects.push_back(rect);
		}
	}
	return objects;
}
int main(int argc, char* argv[])
{
	// 创建MOG2背景建模类
	pBackgroundKnn = createBackgroundSubtractorMOG2(); 
	// 背景建模检测
	// 视频获取
	VideoCapture capture("..\\images\\car.avi");
	if(!capture.isOpened())
		exit(EXIT_FAILURE);
	// 按下q键
	cv::Mat frame;
	std::vector<cv::Rect> regions;
	while (char(waitKey(1)) != 'q')
	{
		// 读取当前帧
		if(!capture.read(frame)) 
			exit(EXIT_FAILURE);
		// 图像尺寸缩小
		regions = get_foreground_objects(frame, 0.25, true);
		for (int i = 0; i < regions.size(); ++i)
		{
			cv::Mat region_img;
			region_img = frame(regions[i]);
			cv::imshow("region_img", region_img);
		}
	}
	return 0;
}




转载:http://blog.csdn.net/zhuwei1988

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值