如何将两张图像作为输入,并用这些代码分别计算出该图像的HOG特征,再利用每张图像的HOG特征值进行两张图像的相似度计算,相似度计算采用余弦相似度算法,最后给出相似度对比结果,请给出完整示例
时间: 2024-04-15 15:30:29 浏览: 77
下面是一个完整示例,演示如何使用给定的代码计算两张图像的HOG特征,并使用余弦相似度算法计算它们之间的相似度,并给出相似度对比结果:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <cmath>
struct DETECTION_ROW {
cv::Vec4f tlwh;
float feature[128];
};
float* get_hog_feature(cv::Mat img)
{
cv::HOGDescriptor hog = cv::HOGDescriptor(cvSize(20, 20), cvSize(10, 10), cvSize(5, 5), cvSize(5, 5), 9);
cv::resize(img, img, cv::Size(30, 30), (0, 0), (0, 0), cv::INTER_LINEAR);
std::vector<float> descriptors;
hog.compute(img, descriptors, cv::Size(20, 20), cv::Size(0, 0));
float* feature_float = (float*)malloc(descriptors.size() * sizeof(float));
assert(feature_float);
for (int i = 0; i < 128; i++)
{
feature_float[i] = descriptors[i * 2];
}
return feature_float;
}
bool getRectsHogFeature(const cv::Mat& img, std::vector<DETECTION_ROW>& d)
{
std::vector<cv::Mat> mats;
int feature_dim = 128;
for (DETECTION_ROW& dbox : d)
{
cv::Rect rc = cv::Rect(int(dbox.tlwh(0)), int(dbox.tlwh(1)), int(dbox.tlwh(2)), int(dbox.tlwh(3)));
rc.x = (rc.x >= 0 ? rc.x : 0);
rc.y = (rc.y >= 0 ? rc.y : 0);
rc.width = (rc.x + rc.width <= img.cols ? rc.width : (img.cols - rc.x));
rc.height = (rc.y + rc.height <= img.rows ? rc.height : (img.rows - rc.y));
cv::Mat mattmp = img(rc).clone();
float* feature_float = get_hog_feature(mattmp);
for (int i = 0; i < feature_dim; i++)
{
dbox.feature[i] = feature_float[i];
}
}
return true;
}
float cosine_similarity(const float* feature1, const float* feature2, int feature_dim)
{
float dot_product = 0.0;
float magnitude1 = 0.0;
float magnitude2 = 0.0;
for (int i = 0; i < feature_dim; i++)
{
dot_product += feature1[i] * feature2[i];
magnitude1 += feature1[i] * feature1[i];
magnitude2 += feature2[i] * feature2[i];
}
magnitude1 = std::sqrt(magnitude1);
magnitude2 = std::sqrt(magnitude2);
return dot_product / (magnitude1 * magnitude2);
}
int main()
{
// 读取两张图像
cv::Mat img1 = cv::imread("image1.jpg", cv::IMREAD_GRAYSCALE);
cv::Mat img2 = cv::imread("image2.jpg", cv::IMREAD_GRAYSCALE);
if (img1.empty() || img2.empty())
{
std::cout << "Failed to read image!" << std::endl;
return -1;
}
// 定义包含矩形框信息的容器
std::vector<DETECTION_ROW> d1;
std::vector<DETECTION_ROW> d2;
DETECTION_ROW dbox1;
dbox1.tlwh = cv::Vec4f(10, 10, 50, 50); // 示例矩形框信息
d1.push_back(dbox1);
DETECTION_ROW dbox2;
dbox2.tlwh = cv::Vec4f(20, 20, 60, 60); // 示例矩形框信息
d2.push_back(dbox2);
// 计算两张图像的HOG特征
getRectsHogFeature(img1, d1);
getRectsHogFeature(img2, d2);
// 计算两张图像的相似度
float similarity = cosine_similarity(d1[0].feature, d2[0].feature, 128);
// 输出相似度结果
std::cout << "Similarity between image1 and image2: " << similarity << std::endl;
return 0;
}
```
在这个示例中,首先读取了两张图像 `image1.jpg` 和 `image2.jpg`,然后定义了两个包含矩形框信息的容器 `d1` 和 `d2`,并向其中分别添加了一个示例矩形框信息。
接下来,调用 `getRectsHogFeature` 函数分别计算两张图像的HOG特征,并将特征存储到相应的数据结构中。
然后,通过调用 `cosine_similarity` 函数计算两张图像的相似度,该函数接受两个特征数组和特征维度作为输入参数,使用余弦相似度算法计算相似度。
最后,输出计算得到的相似度结果。
请确保将示例图像文件 `image1.jpg` 和 `image2.jpg` 放在同一目录下,并使用适当的OpenCV版本进行编译和运行。
阅读全文