下面是基于HOG特征的判断两幅图像相似度代码,代码原理很简单,比较两幅图像的HOG特征相关性。
vector<float> extract_hog_features(Mat& image);
float calculate_relation(vector<float>,vector<float>);
int main(int argc,char **argv)
{
Mat src = cv::imread("./demo.png");
Mat gray;
cvtColor(src, gray,COLOR_BGR2GRAY);
Mat binary;
threshold(gray, binary, 0, 255, THRESH_OTSU + THRESH_BINARY_INV);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
// 按照contours的size大小排序
for (int i = 0; i < contours.size() - 1; i++)
{
for (int j = i + 1; j < contours.size(); j++)
{
if (contours[i].size() < contours[j].size())
{
swap(contours[i], contours[j]);
}
}
}
int n = std::min(2, (int)contours.size());
CV_Assert(n == 2);
Mat image1,image2;
Rect rect = boundingRect(Mat(contours[0]));
image1 = src(rect);
rect = boundingRect(Mat(contours[1]));
image2 = src(rect);
vector<float> descriptor1 = extract_hog_features(image1);
vector<float> descriptor2 = extract_hog_features(image2);
// 计算相关性
float correlation = calculate_relation(descriptor1, descriptor2);
std::cout << "correlation is:" << correlation << endl;
return 0;
}
vector<float> extract_hog_features(Mat& image)
{
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
resize(gray, gray, Size(128, 64));
HOGDescriptor hog(Size(128,64),Size(16,16),Size(8,8),Size(8,8),9);
vector<float> descriptors;
hog.compute(gray, descriptors);
return descriptors;
}
float calculate_relation(vector<float> descriptor1,vector<float> descriptor2)
{
CV_Assert(descriptor1.size() == descriptor2.size());
// 计算内积
float innerMul = 0.0;
float amp1 = 0.0;
float amp2 = 0.0;
for (int i = 0; i < descriptor1.size(); i++)
{
innerMul += descriptor1[i] * descriptor2[i];
amp1 += pow(descriptor1[i], 2);
amp2 += pow(descriptor2[i], 2);
}
float correlation = innerMul / (sqrt(amp1) * sqrt(amp2));
return correlation;
}
返回结果为:
correlation is:0.891036
相关值在0-1之间,所以据此判断两幅图是高度相关的。
Reference:
https://blog.csdn.net/u010977034/article/details/82733137
https://blog.csdn.net/zhuason/article/details/78933250