- 反向投影是反映直方图模型在目标图像中的分布情况。
简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。
通常用HSV色彩空间的HS两个通道直方图模型。 - 反向投影步骤:
①建立直方图模型
②计算待测图像直方图并映射到模型中
③从模型反向计算生成图像 - 实现步骤:
①加载图片imread
②将图像从RGB色彩空间转换到HSV色彩空间cvtColor
③计算直方图和归一化calcHist与normalize
④Mat与MatND其中Mat表示二维数组,MatND表示三维或者多维数据,此处均可以用Mat表示
⑤计算反向投影图像calcBackProject
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void CallBack_Demo(int, void*);
int bins = 1;
Mat src, hsv, hue;
int main(int argc, char** argv)
{
src = imread("../path.jpg");
if (src.empty())
{
cout << "could not load image..." << endl;
return -1;
}
namedWindow("src", WINDOW_AUTOSIZE);
namedWindow("BackProject", WINDOW_AUTOSIZE);
namedWindow("dst_Hist", WINDOW_NORMAL);
imshow("src", src);
cvtColor(src, hsv, COLOR_BGR2HSV);
hue.create(hsv.size(), hsv.depth());
int nchannels[] = { 0,0 };
mixChannels(&hsv,
1,
&hue,
1,
nchannels,
1);
createTrackbar("区间bins大小", "BackProject", &bins, 180, CallBack_Demo);
CallBack_Demo(0, 0);
waitKey(0);
return 0;
}
void CallBack_Demo(int, void*)
{
float range[] = { 0, 180 };
const float *histRanges = { range };
Mat h_hist;
calcHist(&hue, 1, 0, Mat(), h_hist, 1, &bins, &histRanges, true, false);
normalize(h_hist, h_hist, 0, 255, NORM_MINMAX, -1, Mat());
Mat backPrjImage;
calcBackProject(&hue,
1,
0,
h_hist,
backPrjImage,
&histRanges,
1,
true);
imshow("BackProject", backPrjImage);
int hist_h = 400;
int hist_w = 400;
Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(0, 0, 0));
int bin_w = (hist_w / bins);
for (int i = 1; i < bins; i++)
{
rectangle(histImage,
Point((i - 1)*bin_w, (hist_h - cvRound(h_hist.at<float>(i - 1) * (400 / 255)))),
Point(i*bin_w, hist_h),
Scalar(0, 0, 255), -1);
}
imshow("dst_Hist", histImage);
return;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200217231935833.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU1MzQzOQ==,size_16,color_FFFFFF,t_70)