#include<iostream>
#include<opencv2/opencv.hpp>
#define result "【原始图像】"
using namespace std;
using namespace cv;
int bin = 30;
void changeba(int,void*);
Mat hsvimage;
Mat orimage;
Mat himage;
//反向投影
int main()
{
//1.读取原图
orimage= imread("手.jpg");
//2转换 hsv
cvtColor(orimage,hsvimage,CV_BGR2HSV);
//3.分割的h通道,可以用split函数或者之前的mixchannel函数。
himage.create(hsvimage.size(),hsvimage.depth());
int from_to[] = {0,0};//质分离0通道。
mixChannels(&hsvimage,1,&himage,1,from_to,1);
//4.创建滑动窗口。
namedWindow(result,WINDOW_AUTOSIZE);
createTrackbar("bin数值",result,&bin,180,changeba);//创建滑动窗口。
waitKey(0);
return 0;
}
void changeba(int, void*)//
{
//5.准备参数。
int hist_size[] = {MAX(bin,2) };
float Hrange[] = {0,180};
const float* ranges[] = {Hrange};
int channels[] = {0};
//6.开始计算hist和background
Mat hist;
calcHist(&himage,1,channels,Mat(),hist,1,hist_size,ranges);
normalize(hist,hist,0,255,NORM_MINMAX);
//7.计算backgroud反投影。
Mat backgroud;
calcBackProject(&himage,1,channels,hist,backgroud,ranges);
//8.显示反投影。
imshow("反投影图",backgroud);
//9.绘制直方图。这里注意,hist已经是归一化了的。
int h = 400;
int w = 400;
int wbin = cvRound(w/bin);
Mat histimage(h,w,CV_8UC3);
for (int i = 0; i < bin; i++)
{
rectangle(histimage,Point(i*wbin,h),Point((i+1)*wbin,cvRound(h-hist.at<float>(i))),Scalar(255,16,16));
}
imshow("直方图",histimage);
}
利用直方图计算一个图像的反向投影图
最新推荐文章于 2020-10-29 00:49:14 发布