HOG 使用 OpenCV、HOGDescriptor 在 C++ 中进行可视化

Posted

技术标签:

【中文标题】HOG 使用 OpenCV、HOGDescriptor 在 C++ 中进行可视化【英文标题】:HOG features visualisation with OpenCV, HOGDescriptor in C++ 【发布时间】:2012-06-07 10:02:52 【问题描述】:

我使用 OpenCV C++ Lib 的 HOGDescriptor 来计算图像的特征向量。我想可视化源图像中的特征。谁能帮我?

【问题讨论】:

对于任何想要从事此工作的人,这里有一个指向 HOG details 的链接,其中似乎包含了您需要弄清楚一些可视化的所有定义。 出色的 HOG 描述,但它并不能帮助我使用 OpenCV 可视化 C++ 中的功能。 你是认真的吗?没有这些定义,描述符中的值就没有上下文。你是说你已经了解了关于 HOG 的一切,但你只是不知道如何用 C++ 制作图形/GUI? 【参考方案1】:

我今天遇到了完全相同的问题。使用 OpenCV 的 HOGDescriptor::compute() 函数为 64x128 图像计算 HOGDescriptor 向量很容易,但没有内置函数可以将其可视化。

最后我设法理解了梯度方向幅度是如何存储在 3870 长的 HOG 描述符向量中的。

您可以在此处找到用于可视化 HOGDescriptor 的 C++ 代码:

http://www.juergenbrauer.org/old_wiki/doku.php?id=public:hog_descriptor_computation_and_visualization

希望对你有帮助!

于尔根

【讨论】:

这就是我想要的。谢谢。 我注意到您的代码将索引序列“Y 轴到 X 轴”替换为“X 轴到 Y 轴”。 “for (int blockx=0; blockx 计算每个单元格的梯度和可视化每个单元格的梯度是独立的——据我所知。可以先遍历所有行,然后遍历所有列(外循环:for y ...)或反过来(外循环:for x ...)。它只会影响我首先绘制的内容,但结果应该是相同的。此外,当使用 OpenCV 的功能计算 HOG 描述符向量时,HOG 描述符向量中梯度信息的顺序是固定的。 谢谢,但链接已失效。【参考方案2】:

HOGgles¹ 是一种为 HOG 可视化而开发的方法,发表于 ICCV 2013。下面是一个示例:

这种可视化工具可能比绘制 HOG 的梯度向量更有用,因为人们可以更好地了解 HOG 对给定样本失败的原因。

更多信息可以在这里找到:http://web.mit.edu/vondrick/ihog/


¹C。 Vondrick、A. Khosla、T. Malisiewicz、A. Torralba。 “HOGgles: Visualizing Object Detection Features”国际计算机视觉会议 (ICCV),澳大利亚悉尼,2013 年 12 月。

【讨论】:

你知道 HOGgles 的任何 python 实现吗?【参考方案3】:

Thisopencv 群讨论引至a library written at Brown University。

HOGpicture.m 中,您应该能够了解如何可视化描述符。这是相关的(matlab)代码。自己做点东西就够了吗?

(以下代码在MIT license下发布)

function im = HOGpicture(w, bs)

% HOGpicture(w, bs)
% Make picture of positive HOG weights.

% construct a "glyph" for each orientation
bim1 = zeros(bs, bs);
bim1(:,round(bs/2):round(bs/2)+1) = 1;
bim = zeros([size(bim1) 9]);
bim(:,:,1) = bim1;
for i = 2:9,
  bim(:,:,i) = imrotate(bim1, -(i-1)*20, 'crop');
end

% make pictures of positive weights bs adding up weighted glyphs
s = size(w);    
w(w < 0) = 0;    
im = zeros(bs*s(1), bs*s(2));
for i = 1:s(1),
  iis = (i-1)*bs+1:i*bs;
  for j = 1:s(2),
    jjs = (j-1)*bs+1:j*bs;          
    for k = 1:9,
      im(iis,jjs) = im(iis,jjs) + bim(:,:,k) * w(i,j,k);
    end
  end
end

【讨论】:

谢谢。我很难阅读 Matlap 语法。我可以部分跟踪计算,但看不到它如何帮助我可视化特征。代码有说明吗? 我已经很多年没有使用Matlab了,所以对我来说也不是很明显。如果我有时间,我会在我能理解的代码中添加我自己的注释。假设你清楚地描述了在图像的每个像素中放置什么,你能从那里处理它吗?或者您是否需要 HOG 可视化技术以及如何使用 GUI 显示图像?请澄清您的问题。 我要HOG可视化技术。 你能告诉我特征向量的 1 个特征代表什么吗?例如。我有一个图像(64x128),每个单元格 8x8 像素和一个 2x2 单元格的块(每个图像 105 个块),每个 HOG 有 9 个箱(Dalal-triggs)。这会产生 3780 (= 105x2x2x9) 个特征。我如何可视化这些特征? 或者我如何表示图像源中的 3780 个特征中的 1 个?【参考方案4】:

我为任何 blockSizecellSize 重新实现 HOGImage,它基于 Jürgen Brauer 的。见https://github.com/zhouzq-thu/HOGImage。

【讨论】:

欢迎来到 Stack Overflow!虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。

以上是关于HOG 使用 OpenCV、HOGDescriptor 在 C++ 中进行可视化的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV + HOG +SVM:SVM 单特征向量需要帮助

OpenCV - 使用 SVM 和 HOG 进行人员检测

OpenCV 中的 HOG 用于对整个图像进行分类

使用 HOG+SVM Opencv 检测对象的矩形

如何在 Python 中使用 OpenCV 3.0 中的 HOG 功能训练 SVM 分类器?

提高 OpenCV HOG 人员检测器的准确性