只用來記錄學習筆記
- 相關性計算 CV_COMP_CORREL
- 卡方計算 CV_COMP_CHISQR
3. 十字計算 CV_COMP_INTERSECT
4. 巴氏距離計算 CV_COMP_BHATTACHARYYA
代碼:
cvtColor(src1, src1, CV_BGR2HSV);//轉成hsv色彩空間
cvtColor(src2, src2, CV_BGR2HSV);//轉成hsv色彩空間
cvtColor(src3, src3, CV_BGR2HSV);//轉成hsv色彩空間
int h_bins = 50; int s_bins = 60;
int histSize[] = { h_bins,s_bins };
float h_ranges[] = { 0,180 };
float s_ranges[] = { 0,256 };
const float* ranges[] = { h_ranges,s_ranges };
int channels[] = { 0,1 };
MatND hist_src1; //MatND 多維的
MatND hist_src2;
MatND hist_src3;
計算:(詳見:opencv學習筆記21-直方圖計算)
calcHist(&src1, 1, channels, Mat(), hist_src1, 2, histSize, ranges, true, false);
// &src1:輸入圖像指針
// 1:圖像數目
// channels: 通道數
// Mat(): 輸入mask,可選,不用
// hist_src1:輸出的直方圖數據
// 2:維數
// histSize:直方圖級數 50、60
// ranges :值域範圍
// true:true by default
// false: false by defaut
normalize(hist_src1, hist_src1, 0, 1, NORM_MINMAX, -1, Mat());//歸一化0-1
calcHist(&src2, 1, channels, Mat(), hist_src2, 2, histSize, ranges, true, false);
normalize(hist_src2, hist_src2, 0, 1, NORM_MINMAX, -1, Mat());
calcHist(&src3, 1, channels, Mat(), hist_src3, 2, histSize, ranges, true, false);
normalize(hist_src3, hist_src3, 0, 1, NORM_MINMAX, -1, Mat());
compareHist函數(可以改變比較方法,這裏用的是CV_COMP_CORREL):
double src1src1 = compareHist(hist_src1, hist_src1, CV_COMP_CORREL);
double src1src2 = compareHist(hist_src1, hist_src2, CV_COMP_CORREL);
double src2src3 = compareHist(hist_src2, hist_src3, CV_COMP_CORREL);
將值寫到圖片上去:
putText(src1, convertToString(src1src1), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
//src1:
//convertToString(src1src1):文字
//Point(50, 50):位置
//CV_FONT_HERSHEY_COMPLEX:字體
// 1:尺寸因子
//Scalar(0, 0, 255) :線條顏色
//2 :線條寬度
//LINE_AA :線型
putText(src2, convertToString(src1src2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
putText(src3, convertToString(src2src3), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
輸出:
namedWindow("src1", CV_WINDOW_AUTOSIZE);
namedWindow("src2", CV_WINDOW_AUTOSIZE);
namedWindow("src3", CV_WINDOW_AUTOSIZE);
imshow("src1", src1);
imshow("src2", src2);
imshow("src3", src3);
方法:將double轉成string:
String convertToString(double d) {
ostringstream os; //創建一個流
if (os << d) { //把d的值放到os中
return os.str();
}
return "invalid conversion";
}
原圖:
效果圖: