反向投影

/*记录给定图像中的像素点如何适应直方图模型像素分布方式的一种方法,
计算某一特征的直方图模型,然后使用模型去去寻炸哦图像中存在的该特征的方法

反向投影用于在大图像中寻找特定小图像 最匹配点或者区域,也就是定位模板图像出现输入图像的位置

计算反向投影
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);


}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值