利用直方图计算一个图像的反向投影图

#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);



}

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值