4

不幸的是,我既是 python 又是 openCV 初学者,所以如果这个问题很愚蠢,请原谅我。

我正在尝试使用 acv2.HOGDescriptor来识别视频中的对象。我关心逐帧识别(即没有跟踪左右)。


这是我正在做的事情:

  1. 我通过使用阅读了视频(当前为 a .mpg

    capture = cv.CreateFileCapture(video_path) #some path in which I have my video
    #capturing frames
    frame = cv.QueryFrame(capture) #returns cv2.cv.iplimage
    
  2. 为了最终在框架上使用检测器(我会使用

    found, w = hog.detectMultiScale(frame, winStride, padding, scale)
    

    ) 我认为我需要frame从 我所做的转换cv2.cv.iplimagenumpy.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

我真的不明白哪个元素是这里真正的问题。即哪个数字应该是浮点数?

任何帮助表示赞赏

4

2 回答 2

7

无需自己执行额外的转换,该问题与 Python 的新旧 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-18T14:55:49.400 回答
1

HOGDescriptor::detectMultiScale的 C++ 版本的文档在参数之前显示了一个hit_threshold参数(类型为doublewin_stride。因此,您似乎缺少该函数的参数。要接受 的默认参数win_stride,您应该将问题中使用的附加参数作为关键字传递。

于 2013-01-18T14:20:05.607 回答