写在前面
☆ CV_COMP_BHATTACHARYYA 数值越小代表越接近 (巴适距离)
☆ CV_COMP_CORREL 数值越大代表越接近 (相关性计算)
CV_COMP_CHISQR 数值越小说明越接近(K²)
CV_COMP_INTERSECT 十字交叉(老师不懂,我更不懂,先不求甚解 )
这里只演示相关性计算,其他的就换对应参数即可。
代码
#include<iostream>
#include<opencv2/opencv.hpp>
#include<cmath>
using namespace std;
using namespace cv;
string converToString(double d) {
ostringstream os;
if (os << d) {
return os.str();
}
}
int main() {
Mat base, test1, test2;
base = imread("A:\\专用\\TestForTheCV\\class26岬奈奈美灰度图.jpg");
test1= imread("A:\\专用\\TestForTheCV\\class26岬奈奈美.jpg");
test2= imread("A:\\专用\\TestForTheCV\\class26岬奈奈美点点图.jpg");
Mat hsvbase, hsvtest1, hsvtest2;
cvtColor(base, hsvbase, CV_BGR2HSV);
cvtColor(test1, hsvtest1, CV_BGR2HSV);
cvtColor(test2, hsvtest2, CV_BGR2HSV);
int h_bins = 50, 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 };
Mat hist_base;
Mat hist_test1;
Mat hist_test2;
calcHist(&hsvbase, 1, channels, Mat(), hist_base, 2, histsize, ranges, true, false);
normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat());
calcHist(&hsvtest1, 1, channels, Mat(), hist_test1, 2, histsize, ranges, true, false);
normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat());
calcHist(&hsvtest2, 1, channels, Mat(), hist_test2, 2, histsize, ranges, true, false);
normalize(hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat());
double baseVSbase = compareHist(hist_base, hist_base, CV_COMP_CORREL);
double baseVStest1 = compareHist(hist_base, hist_test1, CV_COMP_CORREL);
double baseVStest2 = compareHist(hist_base, hist_test2, CV_COMP_CORREL);
double test2VStest1 = compareHist(hist_test2, hist_test1, CV_COMP_CORREL);
Mat test12;
test2.copyTo(test12);
putText(base, converToString(baseVSbase), Point(50, 50), CV_FONT_BLACK, 1, Scalar(0, 0, 255), 2, LINE_AA);
putText(test1, converToString(baseVStest1), Point(50, 50), CV_FONT_BLACK, 1, Scalar(0, 0, 255), 2, LINE_AA);
putText(test2, converToString(baseVStest2), Point(50, 50), CV_FONT_BLACK, 1, Scalar(0, 0, 255), 2, LINE_AA);
putText(test12, converToString(test2VStest1), Point(50, 50), CV_FONT_BLACK, 1, Scalar(0, 0, 255), 2, LINE_AA);
imshow("base", base);
imshow("test1", test1);
imshow("test2", test2);
imshow("test12", test12);
waitKey(0);
return 0;
}
运行结果