【问题标题】:Difference in hog descriptor computed on color images in Python and C++在 Python 和 C++ 中对彩色图像计算的 hog 描述符的差异
【发布时间】:2018-01-11 07:36:52
【问题描述】:

我在彩色图像上计算了HOGDescriptor,并在 Python 和 C++ 中发现了不同的结果,opencv 版本、HOG 参数和图像在两者上都相同。 在默认 BGR 图像上用 C++ 和 Python 计算的 HOG 描述符之间存在惊人的差异

在默认 BGR2RBG 图像上用 C++ 和 Python 计算的 HOG 描述符之间再次存在惊人的差异。然而,C++ 似乎遵循了(由 Dalal,Triggs 推荐)将 HOG 计算为所有三个通道的最大值的方法,这可以通过 BGR 和 RGB 图像具有相同的 HOG 描述符这一事实证明,但 Python 没有

然而,图像的灰度版本显示相似(但不相同)的描述符值。

HOG 参数:

cv::HOGDescriptor hogDescriptor;
hogDescriptor.blockSize = cv::Size(8, 8);
hogDescriptor.cellSize = cv::Size(4, 4);
hogDescriptor.blockStride = cv::Size(4, 4);
hogDescriptor.nbins = 9;
hogDescriptor.signedGradient = true;
hogDescriptor.winSize = cv::Size(72, 72);

我的问题是,为什么 C++ 和 Python 实现之间存在如此大的差异,即使 Python 只是 C++ 版本的包装器?

【问题讨论】:

  • @ThomasMatthews。虽然这两个问题看起来很相似,但它们在计算 HOG 时提出了不同的问题:opencv 在以相同语言在不同颜色图像上计算 HOG 和在不同语言在相同色彩空间上计算 HOG 的行为
  • cv2 Python 模块“只是一个包装器”有点错误。最初的 cv 模块是,但 cv2 使用 numpy 类型进行计算,所以事情通常会有很小的差异(不知道这是否是这里的实际问题)。

标签: python c++ opencv


【解决方案1】:

我找到了灰度图像的解决方案。 HOG 描述符的 Python 包装器代码将 gammaCorrection 标志初始化为 False,而不是 C++ 中的 True。手动将标志设置为 True 或 False 会导致 C++ 和 Python 在灰度图像上的值完全相同。

但是,彩色图像仍然存在问题。

我的最佳猜测是,就像 gammaCorrection 标志差异一样,Python 包装器中也发生了类似的事情。

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 2017-01-14
    • 2019-08-19
    • 2014-04-12
    • 2012-03-11
    • 2013-03-10
    • 2014-10-11
    • 2014-05-15
    • 2017-11-10
    相关资源
    最近更新 更多