Opencv2.4學習::根據直方圖匹配原影象-----直方圖反向投影
阿新 • • 發佈:2018-12-08
#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; }