不幸的是,我既是蟒蛇,又是openCV初学者,所以如果这个问题很愚蠢,请原谅。
我正在尝试使用cv2.HOGDescriptor来识别视频中的对象。我关心的是一帧一帧的识别(即没有跟踪)。
以下是我正在做的事情:
.mpg)
capture = cv.CreateFileCapture(video_path) #我的视频#捕获帧=cv.QueryFrame(捕获)#返回cv2.cv.iplimage的路径frame从cv2.cv.iplimage转换为numpy.ndarray,这是我所做的
tmp = cv.CreateImage(cv.GetSize(frame),8,3) cv.CvtColor(frame,tmp,cv.CV_BGR2RGB) ararr = np.asarray(cv.GetMat(tmp))。现在,我有以下错误:
found, w = hog.detectMultiScale(ararr, winStride, padding, scale)
TypeError: a float is required哪里
winStride=(8,8)
padding=(32,32)
scale=1.05我真的不明白哪个元素才是真正的问题。也就是说,哪个数字应该是浮点数?
感谢你的任何帮助
发布于 2013-01-18 14:55:49
没有必要自己执行额外的转换,这个问题与新的和旧的OpenCV绑定的混合有关。有关hog.detectMultiScale的另一个问题只是由于参数排序不正确。
第二个问题可以通过检查help(cv2.HOGDescriptor().detectMultiScale)直接看到。
detectMultiScale(img[, hitThreshold[, winStride[, padding[,
scale[, finalThreshold[, useMeanshiftGrouping]]]]]])如您所见,每个参数都是可选的,但第一个参数是(图像)。排序也很重要,因为您正在有效地使用winStride作为第一个,而期望它是第二个,依此类推。您可以使用命名参数传递它。(在先前的答复中已经观察到了这一切。)
另一个问题是代码组合,下面是您应该考虑使用的示例代码:
import sys
import cv2
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}
video = cv2.VideoCapture(sys.argv[1])
while True:
ret, frame = video.read()
if not ret:
break
result = hog.detectMultiScale(frame, **hogParams)
print result发布于 2013-01-18 14:20:05
C++版本的HOGDescriptor::多尺度探测文档显示了在win_stride参数之前的hit_threshold参数(类型为double)。因此,您似乎缺少了函数的参数。若要接受win_stride的默认参数,应将问题中使用的加法参数作为关键字传递。
https://stackoverflow.com/questions/14400560
复制相似问题