c++将hog.compute函数向量可视化
时间: 2024-01-21 19:18:18 浏览: 68
将HOG特征向量进行可视化的方法有很多种,下面提供一种简单的方法:
1. 首先将HOG特征向量reshape成图像的大小,即将一维的向量重新变成二维的矩阵。
2. 对于每个cell,计算其HOG特征向量,然后将其绘制成一个箭头。箭头的长度表示梯度的强度,箭头的方向表示梯度的方向。
3. 将所有cell的箭头拼接在一起,就可以得到整张图像的HOG特征可视化结果。
下面是一个示例代码:
```
cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
cv::Mat img = cv::imread("test.jpg");
std::vector<cv::Point> locations;
std::vector<float> descriptors;
hog.compute(img, descriptors, cv::Size(8, 8), cv::Size(0, 0), locations);
int descriptor_dim = descriptors.size() / locations.size();
int cell_size = hog.cellSize().height;
int block_size = hog.blockSize().height * cell_size;
int img_width = img.cols / cell_size * cell_size;
int img_height = img.rows / cell_size * cell_size;
cv::Mat hog_image(img_height, img_width, CV_8UC3, cv::Scalar(0, 0, 0));
for (int i = 0; i < locations.size(); i++)
{
int x = locations[i].x / cell_size;
int y = locations[i].y / cell_size;
cv::Point pt(x * cell_size + cell_size / 2, y * cell_size + cell_size / 2);
float* descriptor = &descriptors[i * descriptor_dim];
for (int j = 0; j < descriptor_dim; j++)
{
float magnitude = descriptor[j];
float angle = j * 180.f / descriptor_dim;
cv::Point pt2(pt.x + magnitude * block_size * cos(angle),
pt.y + magnitude * block_size * sin(angle));
cv::line(hog_image, pt, pt2, cv::Scalar(0, 255, 0), 1);
}
}
cv::imshow("HOG Image", hog_image);
cv::waitKey(0);
```
该代码将HOG特征向量可视化成一张图像,其中箭头的长度和颜色表示梯度的强度,箭头的方向表示梯度的方向。你可以自行调整箭头的长度、颜色和宽度,以及整张图像的大小和颜色。
阅读全文