fis*_*ish 13 python opencv image-processing
我想知道是否有人知道为什么在OpenCV的Python绑定中没有HOGDescriptors的文档.
也许我只是错过了它们,但我发现它们的唯一代码是这个线程:从OpenCV + Python获取HOG图像功能?
如果您在该线程中向下滚动,则可在此处找到此代码:
import cv2
hog = cv2.HOGDescriptor()
im = cv2.imread(sample)
h = hog.compute(im)
Run Code Online (Sandbox Code Playgroud)
我已经测试了它并且它有效 - 所以Python Bindings确实存在,只是文档没有.我想知道是否有人知道为什么HOG的Python绑定的文档很难找到/不存在.有谁知道是否有一个我可以在任何地方阅读HOG的教程(特别是通过Python绑定)?我是HOG的新手,想在我开始编写自己的东西之前看一些OpenCV如何处理的例子.
mdi*_*lip 20
1.获取内置文档: python控制台上的以下命令将帮助您了解类HOGDescriptor的结构:
import cv2
help(cv2.HOGDescriptor())
2.实施例的代码: 这是一个代码片段来初始化不同参数的cv2.HOGDescriptor(I这里所用的术语是被OpenCV的文档中良好定义的标准条款这里):
import cv2
image = cv2.imread("test.jpg",0)
winSize = (64,64)
blockSize = (16,16)
blockStride = (8,8)
cellSize = (8,8)
nbins = 9
derivAperture = 1
winSigma = 4.
histogramNormType = 0
L2HysThreshold = 2.0000000000000001e-01
gammaCorrection = 0
nlevels = 64
hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins,derivAperture,winSigma,
histogramNormType,L2HysThreshold,gammaCorrection,nlevels)
#compute(img[, winStride[, padding[, locations]]]) -> descriptors
winStride = (8,8)
padding = (8,8)
locations = ((10,20),)
hist = hog.compute(image,winStride,padding,locations)
Run Code Online (Sandbox Code Playgroud)
3.推理: 得到的猪的描述符将具有以下维度:9个方向X(获得1个归一化的4个角块+获得2个归一化的边缘上的6x4块+获得4个归一化的6x6块)= 1764.因为我仅给出hog.compute()的一个位置.
4.初始化HOGDescriptor的不同方法:另
一种初始化方法是从包含所有参数值的xml文件:
hog = cv2.HOGDescriptor("hog.xml")
Run Code Online (Sandbox Code Playgroud)
要获取xml文件,可以执行以下操作:
hog = cv2.HOGDescriptor()
hog.save("hog.xml")
Run Code Online (Sandbox Code Playgroud)
并编辑xml文件中的相应参数值.
我也想知道。HOGDescriptor除了源 cpp 代码之外,几乎找不到 OpenCV 的文档。
Scikit-image 有一个关于提取和说明 HOG 特征的很好的示例页面。它提供了探索 HOG 的另一种选择。它记录在此处。
然而,关于 scikit-image 的 hog 实现有一点需要指出。它的hog 函数的Python 代码没有实现对直方图方向分箱的加权投票,而只是根据落入哪个分箱的幅度值进行简单的分箱。查看它的hog_histogram 函数。这并没有完全遵循 Dalal 和 Triggs 的论文。
实际上,我发现基于 OpenCV 的 HOG 实现的对象检测比使用 scikit-image 的 api 更准确。这对我来说很有意义,因为加权投票很重要。通过对 bin 进行加权投票,当梯度幅度落在边界上或边界附近时,直方图的变化会大大减少。Chris McCormick 写了一篇关于 hog的非常有见地的博客,其中方向分箱被清楚地描述为
对于每个梯度向量,它对直方图的贡献由向量的大小给出(因此更强的梯度对直方图有更大的影响)。我们在两个最近的 bin 之间分配贡献。因此,例如,如果梯度向量的角度为 85 度,那么我们将其幅度的 1/4 添加到以 70 度为中心的 bin,并将其幅度的 3/4 添加到以 90 度为中心的 bin。
我相信拆分贡献的目的是最小化两个 bin 之间边界上的梯度问题。否则,如果强梯度正好位于 bin 的边缘,则梯度角度的轻微变化(将梯度推入下一个 bin)可能会对直方图产生强烈影响。
所以,如果可能的话,使用 OpenCV 来计算 hog(没有深入研究它的代码,也不想这样做,但我认为 OpenCV 的 hog 实现方式更合适)。我不仅发现检测精度有所提高,而且运行速度也更快。与 scikit-image 的带有精彩注释的 hog 代码相比,它的文档几乎没有。然而,让 OpenCV 的版本在实践中工作仍然是可行的——这是传递窗口大小、单元格大小、块大小、块步幅、方向数量等的正确参数的问题。其他参数我只是使用默认值。