/*记录给定图像中的像素点如何适应直方图模型像素分布方式的一种方法,
计算某一特征的直方图模型,然后使用模型去去寻炸哦图像中存在的该特征的方法
反向投影用于在大图像中寻找特定小图像 最匹配点或者区域,也就是定位模板图像出现输入图像的位置
计算反向投影
Void calcBackProject(const Mat *images,//输入图 CV_8U CV_32F 通道任意
int nimages,//输入数组个数 有几张图
Const int* channnels,//统计的通道索引 0 到image[0].channels()-1
Inputarray backProject,//输入的直方图
Outputarray backProject,//目标反向投影阵列 单通道 和image[0]相同大小深度
Const float**ranges,//每一个一维数组的每一维的边界阵列, 每一维数组的取值范围
Double scale=1,// 输出的方向投影可选的缩放因子
Bool uniform=true// 是否均匀标识符
);
通道复制
Void mixChannels(
ConstmMat *src,//输入的图 所有图相同深度和尺寸
Size_t nsrc,//输入的矩阵数目
Mat *dst,//输出的数组,所有矩阵必须被初始化 ,大小深度必须和src[0]相同
Size_t ndsts,//dst输入的矩阵数目
Const int*fromTo,//对指定通道进行复制的数组索引
Size_t npairs//fromTo的索引数目
)
Void mixChannels(
Const vector<Mat>&src,//输入的矩阵变量,所有图相同深度和尺寸
Vector<Mat> &dst,//输出的矩阵向量,所有矩阵必须被初始化,大小深度和src[0]相同
Const int*fromTo;//对指定的通道进行索引复制
Size_t npairs//第三个参数的索引数目
)
*/
#include <opencv2//highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/photo/photo.hpp>
using namespace std;
using namespace cv;
//*********************************
//("C:/Users/hasee-pc/Desktop/women.jpg");
//*********************************
#define WINDOW_NAME1 "【原始图】"
Mat g_srcImage;
Mat g_hsvImage;
Mat g_hueImage;
int g_bins = 30;
void on_BinChange(int, void*);
int main()
{
g_srcImage = imread("C:/Users/hasee-pc/Desktop/girl.jpg", 1);
cvtColor(g_srcImage, g_hsvImage, COLOR_BGR2HSV);//转换HSV
//分离hue色调通道
g_hueImage.create(g_hsvImage.size(), g_hsvImage.depth());
int ch[] = { 0,0 };
mixChannels(&g_hsvImage, 1, &g_hueImage, 1, ch, 1);
//bin数目
namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);
createTrackbar("色调组距:", WINDOW_NAME1, &g_bins, 180, on_BinChange);
on_BinChange(0, 0);
imshow(WINDOW_NAME1, g_srcImage);
waitKey(0);
}
void on_BinChange(int, void *)
{
MatND hist;
int histSize = MAX(g_bins, 2);
float hue_range[] = { 0,180 };
const float*ranges = { hue_range };
//计算直方图 并且归一化
calcHist(&g_hueImage,
1,
0,
Mat(),
hist,
1,
&histSize,
&ranges,
true,
false
);
normalize(hist,
hist,
0,
255,
NORM_MINMAX,
-1,
Mat()
);
//计算反向投影
MatND backproj;
calcBackProject(
&g_hueImage,
1,
0,
hist,
backproj,
&ranges,
1
);
imshow("反向投影", backproj);
int w = 400, h = 400;
//绘制直方图
int bin_w = cvRound((double)w / histSize);
Mat histImg = Mat::zeros(w, h, CV_8UC3);
for (int i = 0; i < g_bins; ++i)
{
rectangle(histImg,
Point(i*bin_w, h),
Point((i + 1)*bin_w, h - cvRound(hist.at<float>(i)*h / 255.0)),
Scalar(100, 123, 255),
-1
);
}
imshow("直方图", histImg);
}