OpenCV——反向投影(定位模板圖像在輸入圖像中的位置)


反向投影:

 

 

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 
 4 using namespace cv;
 5 using namespace std;
 6 #define WINDOW_NAME "效果圖"
 7 
 8 Mat src, hsv, hue;
 9 Mat temp, temp_hsv, temp_hue;
10 int bin = 30;//直方圖組距
11 void on_BinChange(int, void*);
12 
13 int main(int argc, char** argv)
14 { 
15     src = imread("test.jpg");
16     temp = imread("temp.jpg");
17     if (src.empty()|| temp.empty()) {
18         printf("Could not load image...");
19         return -1;
20     }
21     imshow("Input Image",src);
22 
23     //轉到HSV空間
24     cvtColor(src, hsv, COLOR_BGR2HSV);
25     cvtColor(temp, temp_hsv, COLOR_BGR2HSV);
26 
27     //分離Hue色調通道
28     hue.create(hsv.size(),hsv.depth());
29     temp_hue.create(temp_hsv.size(), temp_hsv.depth());
30     int ch[]= {0,0};
31     mixChannels(&hsv, 1, &hue, 1, ch, 1);
32     mixChannels(&temp_hsv, 1, &temp_hue, 1, ch, 1);
33 
34     
35     //創建Trackbar來輸入bin的數目
36     namedWindow(WINDOW_NAME,WINDOW_AUTOSIZE);
37     createTrackbar("色調組距", WINDOW_NAME,&bin,180, on_BinChange);
38 
39     //進行一次初始化
40     on_BinChange(0, 0);
41 
42     imshow(WINDOW_NAME, src); 
43     
44     waitKey(0);
45     return 0;
46 }
47 
48 void on_BinChange(int, void*)
49 {
50     //參數准備
51     MatND hist;
52     int histSize = max(bin, 2);
53     float hue_range[] = { 0,180 };//h通道的取值范圍
54     const float* ranges = {hue_range};
55 
56     //計算直方圖並歸一化
57     //calcHist(&hue, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false);
58     //normalize(hist,hist,0,255,NORM_MINMAX,-1,Mat());
59     calcHist(&temp_hue, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false);
60     normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat());
61 
62     //計算反向投影
63     MatND backproj;
64     calcBackProject(&hue,1,0,hist,backproj,&ranges,1,true);
65 
66     imshow("反向投影圖", backproj);
67 
68     //繪制直方圖參數准備
69     int w = 400, h = 400;
70     int bin_w = cvRound((double)w/histSize);
71     Mat histImg = Mat::zeros(w,h,CV_8UC3);
72 
73     //繪制直方圖
74     for(int i=0;i<bin;i++)
75     {
76         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);
77     }
78 
79     imshow("直方圖",histImg);
80 
81 }

直方圖反向投影可以在“輸入圖像”中 找到和“模板”直方圖特征相似的部分。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM