HOGDescriptor,带有可识别物体的视频

时间:2013-01-18 14:03:54

标签: python opencv object-detection

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

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


这是我正在做的事情:

  1. 我使用

    阅读了视频(目前为.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)
    

    )我认为我需要将framecv2.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)).
    
  3. 现在我有以下错误:

        found, w = hog.detectMultiScale(ararr, winStride, padding, scale)
     TypeError: a float is required
    

    ,其中

        winStride=(8,8)
        padding=(32,32)
        scale=1.05
    

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

    任何帮助表示赞赏

2 个答案:

答案 0 :(得分:6)

没有必要自己执行额外的转换,这个问题与新旧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

答案 1 :(得分:1)

HOGDescriptor::detectMultiScale的C ++版本的文档在hit_threshold参数之前显示double参数(类型为win_stride)。所以看起来你错过了函数的参数。要接受win_stride的默认参数,您应该将问题中使用的附加参数作为关键字传递。