1、概述
概念:反向投影是反应直方图模型在目标图像中的分布情况。简单点来说就是用直方图模型去目标图像中寻找是否有相似的对象。
ps:所以这里需要有两个输入:1.模型图片 。2.场景图片 ,即利用模型图片直方图去场景图片中搜索。
calcBackProject(
const Mat* images,//const Mat类型的images,输入的数组(或数组集),它们需为相同的深度(CV_8U或CV_32F)和相同的尺寸,而通道数可以任意
int nimages,//int类型的nimages,输入数组的个数,也就是第一个参数中存放了多少张图像,有几个源数组
const int* channels,//const int类型的channels,需要统计的通道索引。第一个数组通道从0到image[0].channels-1,第二个数组通道从images[0].channes()计算到images[0].channels()+images[1].channels()-1
InputArray hist,//InputArray类型的hist,输入的直方图
OutputArray backProject,//OutputArray类型的backProject,目标反向投影阵列,其须为单通道,并且和image[0]有相同的大小和深度
const float** ranges,//const float**类型的ranges,表示每一个维度数组(第六个参数dims)的每一维边界阵列,可以理解为每一维数值的取值范围
double scale=1,//double scale,有默认值1,输出的方向投影可选的缩放因子,默认值为1
bool uniform=true//boo类型的uniform,指示直方图是否均匀的标识符,有默认值true
);
操作步骤:
1.载入模型图及场景图
2.将模型图和场景图转换为HSV色彩空间
3.计算模型图直方图
4.模型直方图归一化
5.执行反向投影
6.输出图像
2、代码示例
//[1]载入模型图片及场景图片
Mat src = imread(filePath);
Mat src_roi=imread("C:\\Users\\wei.yang\\Downloads\\opencv_res\\highway_hue.jpg");
if(src.empty()){
return;
}
imshow("src",src);
//[2]将模型图片和场景图片转换为HSV色彩空间
Mat src_hsv,src_hsv_roi;
cvtColor(src, src_hsv, COLOR_BGR2HSV);
cvtColor(src_roi, src_hsv_roi, COLOR_BGR2HSV);
//【3】计算模型图直方图
MatND roiHist; //直方图对象
int dims = 2; //特征数目(直方图维度)
float hranges[] = { 0,180 }; //特征空间的取值范围
float Sranges[] = { 0,256 };
const float *ranges[] = { hranges,Sranges };
int size[] = { 20,32 }; //存放每个维度的直方图的尺寸的数组
int channels[] = {0,1}; //通道数
calcHist(&src_hsv_roi,1, channels, Mat(), roiHist, dims, size, ranges);
//【4】直方图归一化
normalize(roiHist, roiHist, 0, 255, NORM_MINMAX);
//【5】反向投影
Mat proImage; //投影输出图像
calcBackProject(&src_hsv, 1, channels, roiHist, proImage, ranges);
imshow("proImage",proImage);
3、示例图片