opencv學習筆記23-直方圖比較compareHist

只用來記錄學習筆記

  1. 相關性計算 CV_COMP_CORREL
    在這裏插入圖片描述
  2. 卡方計算 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";
}

原圖:
在這裏插入圖片描述
效果圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章