#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat src, src_gray, hsv, hue;
int bins = 12;
void Backprojection(int,void*);
int main()
{
src = imread("D:/opencv练习/picture/33.jpg");
if (!src.data)
{
cout << "图片没有加载成功" << endl;
return -1;
}
char window_image[] = "input image";
namedWindow(window_image, WINDOW_AUTOSIZE);
namedWindow("back project", WINDOW_AUTOSIZE);
namedWindow("histogram", WINDOW_AUTOSIZE);
//分离通道
cvtColor(src, hsv, COLOR_BGR2HSV);
hue.create(hsv.size(), hsv.depth());//声明hue图像,用来存放分离出来的一个通道
int nchannels[] = { 0,0 };//声明从哪个通道到哪个通道,from to
mixChannels(&hsv, 1, &hue, 1, nchannels, 1);//将hsv的0通道放到hue的0通道
//
createTrackbar("histogram", window_image, &bins, 180,Backprojection);
Backprojection(0, 0);
imshow(window_image, src);
waitKey(0);
return 0;
}
void Backprojection(int,void*)
{
//计算直方图
float range[] = { 0,180 };//定义range
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());//归一化到0至255之间
Mat backprimage;
calcBackProject(&hue, 1, 0, h_hist, backprimage, &histRanges, 1, true);//反向投影
imshow("back project", backprimage);
//绘制直方图
int hist_h = 400, hist_w = 400;
Mat histimage(hist_h, hist_w, 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, cvRound(hist_h - h_hist.at<float>(i - 1) * 400 / 255)),
Point(i*bin_w, hist_h),
Scalar(0, 0, 255),-1);
}
imshow("histogram", histimage);
return;
}
10-21
1519