1. 程式人生 > >Opencv2.4學習::根據直方圖匹配原影象-----直方圖反向投影

Opencv2.4學習::根據直方圖匹配原影象-----直方圖反向投影

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;

int main()
{
	//原影象
	Mat srcImage = imread("F:\\opencv_re_learn\\2.jpg");
	//直方圖匹配部分
	Mat matchImage = imread("F:\\opencv_re_learn\\4.jpg");
	if (!srcImage.data){
		cout << "failed to read" << endl;
		system("pause");
		return -1;
	}
	imshow("srcImage", srcImage);
	//匹配部分轉換為灰度圖
	Mat matchgray;
	cvtColor(matchImage, matchgray, CV_BGR2GRAY);
	Mat srcGray;
	cvtColor(srcImage, srcGray, CV_BGR2GRAY);
	//初始化直方圖計算引數
	int bins = 5;
	MatND hist;
	int histSize = MAX(bins, 2);//分成25個區間
	float hue_range[] = { 0, 255 };//每個區間值域
	const float *ranges = { hue_range };
	//計算直方圖並歸一化
	calcHist(&matchgray, 1, 0, Mat(),
		hist, 1, &histSize, &ranges, true, false);
	normalize(hist, hist, 0, 255, NORM_MINMAX,
		-1, Mat());//又歸一化到0-255
	//△△實際上,計算完的hist就是匹配部分的特徵了
	
	//計算反向投影
	//即根據特徵在原影象上進行匹配
	MatND backproj;
	calcBackProject(&srcGray, 1, 0, hist, backproj,
		&ranges, 1, true);
	//定義輸出影象
	int w = 320; int h = 360;
	int bin_w = cvRound((double)w / histSize);
	Mat histImg = Mat::zeros(w, h, CV_8UC3);
	for (int i = 0; i < bins; i++){
		//繪製直方圖
		rectangle(histImg, Point(i*bin_w, h),
			Point((i + 1)*bin_w,
			h - cvRound(hist.at<float>(i)*h / 255.0)),
			Scalar(0, 0, 255), -1);
	}
	//顯示反向投影影象
	imshow("BackProj", backproj);

	waitKey(0);
	return 0;
}