【问题标题】:HOGDescriptor with videos to recognize objectsHOGDescriptor 带有视频以识别对象
【发布时间】:2013-01-02 06:14:24
【问题描述】:

不幸的是,我既是 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)).
    

现在我有以下错误:

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

在哪里

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

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

任何帮助表示赞赏

【问题讨论】:

    标签: python opencv object-detection


    【解决方案1】:

    不需要自己执行额外的转换,这个问题与 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
    

    【讨论】:

    • 谢谢你,感谢你给我们上了一堂精彩的 Python 课!我对另一件事感到很困惑:为什么在 cv2 绑定中没有打开窗口的功能? IE。 cv2.NamedWindow 给我错误,而cv.NamedWindow 没有。是否有正确的方法来打开一个窗口并使用新的绑定?
    • @Acorbe 不幸的是很多函数都被重命名了,你可能在cv2.namedWindow之后(大小写不同)。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,它让我的代码运行起来了。虽然,在我考虑作为参考的 opencv 示例 peopledetect.py 中,函数调用是 found, w = hog.detectMultiScale(img, winStride=(8,8), padding=(32,32), scale=1.05)。该文件在我的机器上运行。有什么线索吗?
    • 只是一个猜测,但在该示例中,您将这些参数作为关键字传递,这允许该方法使用 hit_threshold 的默认值。但是在上面的示例中,您使用的是位置参数,因此它认为您的 winStride 正在作为 hit_threshold 参数传递。
    • 是的,你的线索是对的!您可能希望在您的答案中包含您的最后一条评论,以方便其他用户找到答案。基本上问题是我停止将参数作为关键字传递。我的超级菜鸟。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2021-06-25
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多