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、示例图片

opencv反光_C/C++

opencv反光_C/C++_02