一、API函数
void mixChannels(const Mat* src,int nsrc,Mat* dst ,int ndst,const int* fromTo,size_t npairs);
1、**&hsv:**要从中复制通道的源数组
2、1:源数组的数量
3、**&hue:**复制的频道的目标数组
4、1:目标数组的数量
5、ch [] = {0,0}:指示通道如何复制的索引对数组。在这种情况下,&hsv的Hue(0)通道正被复制到0通道的6、&Hue(1通道),
7、1:索引对数
void cv::calcBackProject
(
const Mat * images,
int nimages,
const int * channels,
InputArray hist,
OutputArray backProject,
const float ** ranges,
double scale = 1,
bool uniform = true
)
1、const Mat* images:输入图像,图像深度必须位CV_8U,CV_16U或CV_32F中的一种,尺寸相同,每一幅图像都可以有任意的通道数
2、int nimages:输入图像的数量
3、const int* channels:用于计算反向投影的通道列表,通道数必须与直方图维度相匹配
4、InputArray hist:输入的直方图,直方图的bin可以是密集(dense)或稀疏(sparse)
5、OutputArray backProject:目标反向投影输出图像,是一个单通道图像,与原图像有相同的尺寸和深度
6、const float ranges**:直方图中每个维度bin的取值范围
7、double scale=1:可选输出反向投影的比例因子
二、程序
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main(int, char** argv)
{
Mat src;
//利用阈值函数分割指定区域生成掩膜,通过直方图分布查找其他图像相同区域
Mat src1 = imread("2.png");
imshow("原图", src1);
threshold(src1, src, 235, 255, 4);
Mat hsv, h,hist,back;
if (src.empty())
{
cout << "未输入图像" << endl;
return -1;
}
cvtColor(src, hsv, COLOR_BGR2HSV);
//分离H通道
h.create(hsv.size(), hsv.depth());
int ch[] = { 0, 0 };
mixChannels(&hsv, 1, &h, 1, ch, 1);
//等价于split函数
/* vector<Mat>mv;
split(hsv, mv);
h = mv[0];*/
Mat dst, dh, dhsv;
flip(src1, dst, -1);
imshow("实验图", dst);
cvtColor(dst, dhsv, COLOR_BGR2HSV);
//分离H通道
dh.create(dhsv.size(), dhsv.depth());
int ch1[] = { 0, 0 };
mixChannels(&dhsv, 1, &dh, 1, ch1, 1);
int histSize = 8;
float hue_range[] = { 0, 180 };
const float* ranges = { hue_range };
calcHist(&h, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false);
normalize(hist, hist, 0, 255, NORM_MINMAX, -1);
calcBackProject(&dh, 1, 0, hist, back, &ranges, 1, true);
imshow("back", back);
waitKey(0);
return 0;
}