一、简介
图像直方图的反向投影是一个概率分布图,表示一个指定图像片段出现在特定位置的概率。当我们已知图像中某个物体的大体位置时,可以通过概率分布图找到物体在另一张图像中的准确位置。我们可以设定一个初始位置,在其周围反复移动来提高局部匹配概率,从而找到物体的准确位置,这个实现过程叫做均值平移算法。
二、实现过程
因为人物的面部特征相对于其他位置更明显,本次实验主要应用于人物的面部识别。
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