2014-12-07 95 views
1

我尝试计算图像上的HOG功能。此代码:OpenCV HOGDescriptor.compute错误

hog = cv2.HOGDescriptor() 
return hog.compute(image) 

引发以下错误在第二行:

error: ..\..\..\..\opencv\modules\objdetect\src\hog.cpp:630: error: (-215) (unsigned)pt.x <= (unsigned)(grad.cols - blockSize.width) && (unsigned)pt.y <= (unsigned)(grad.rows - blockSize.height) in function cv::HOGCache::getBlock 

我检查image是有效的图片。你有关于问题的根源的想法吗?

+2

您的HoGDescriptor会采用什么尺寸,您的图片的尺寸是多少?尝试重新缩放图像以适合“winSize” – Micka 2014-12-07 14:32:34

+0

非常感谢!就是这样。如果您将其作为答案发布,我会将其标记为已接受的答案。 – Arnaud 2014-12-07 15:16:49

回答

3

错误消息看起来像图像像素超出了您的HoG窗口区域。据我所知,HoG描述符具有某种“winSize”属性(例如64x128像素的人物描述符afair)。

通过调整图像大小或选择相关子区域,确保图像符合描述符窗口大小!

3

1.获取内置文档:您也可以根据您的要求改变HOGDescriptor性质, 你的Python控制台下面的命令将帮助你知道类HOGDescriptor的结构:

import cv2 help(cv2.HOGDescriptor())

2.示例代码:下面是用不同参数初始化cv2.HOGDescriptor的代码片段(这里使用的术语是在OpenCV文档here中明确定义的标准术语):

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) 

3.推理:所得猪描述符将具有尺寸为: 9取向X(4角块即获得在该获得2个归一化+ 6x6的块即得到4边缘1个正常化+ 6×4块规范化)= 1764.因为我只给出了hog.compute()的一个位置。

4.初始化另一种方式是它包含了所有的参数值的XML文件:

hog = cv2.HOGDescriptor("hog.xml") 

为了得到一个XML文件可以做到以下几点:

hog = cv2.HOGDescriptor() 
hog.save("hog.xml") 

和编辑xml文件中的各个参数值​​。

问题的解决方案:您可以将'winSize'值更改为您想要的值。使您的图像尺寸不会出HoG窗口区域。