openCV中meanshift算法查找目标

一、简介

图像直方图的反向投影是一个概率分布图,表示一个指定图像片段出现在特定位置的概率。当我们已知图像中某个物体的大体位置时,可以通过概率分布图找到物体在另一张图像中的准确位置。我们可以设定一个初始位置,在其周围反复移动来提高局部匹配概率,从而找到物体的准确位置,这个实现过程叫做均值平移算法。

二、实现过程

因为人物的面部特征相对于其他位置更明显,本次实验主要应用于人物的面部识别。

1、设定感兴趣的区域

感兴趣区域的设定有两种方式,一种是已知图片人物脸部位置的像素坐标,通过设定矩形框来定位到人物脸部位置,另一种是使用opencv自带的selectROI函数,手动框选自己感兴趣的位置。

2、获取脸部直方图并做归一化

设置一个ColorHistogram类增加一个获取色调直方图的函数getHueHistogram。此函数包含将图像转换成HSV色彩空间,屏蔽低饱和度的像素(可能用到,也可能用不到),计算图像直方图。

cv::Mat getHueHistogram(const cv::Mat &image2, int minSaturation = 0)
	{
		cv::Mat hist;

		//转换成HSV色彩空间
		cv::Mat hsv;
		cv::cvtColor(image2, hsv, CV_BGR2HSV);
		//cv::imshow("hsv", hsv);

		//掩码(可能用的到也可能用不到)
		cv::Mat mask;
		if (minSaturation > 0) {
			std::vector<cv::Mat>v;
			cv::split(hsv, v);  //将3个通道分割进3幅图像

			cv::threshold(v[1], mask, minSaturation, 255, cv::THRESH_BINARY);//屏蔽低饱和度的像素
		}

		//准备一维色调直方图的参数
		hranges[0] = 0.0;
		hranges[1] = 180.0;  //范围是0~180
		channels[0] = 0;   //色调通道

		//计算直方图
		cv::calcHist(&hsv, 1,   //仅为一幅图像的直方图
			channels,             //使用的通道
			mask,                 //二值掩码
			hist,                 //作为结果的直方图
			1,                    //这是一维的直方图
			histSize,             //箱子数量
			ranges);              //像素值的范围
		return hist;
	}

然后,对获取的直方图做归一化。

void setHistogram(con
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白汐汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值