视频识别对象的HOGDescriptor

2024-10-04 11:23:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我试图使用cv2.HOGDescriptor来识别视频中的对象。我关心的是一帧一帧的识别(也就是说,没有跟踪等等)。


我正在做的是:

  1. 我通过使用

    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

我真的不明白哪一个元素才是真正的问题。一、 哪个数字应该是浮点数?

感谢任何帮助


Tags: pathvideocv2framecvtmpcapturescale
2条回答

不需要自己执行额外的转换,这个问题与新的和旧的OpenCV绑定的Python混合有关。关于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
<> >HOGDescriptor::detectMultiScale的C++版本的文档在^ {< CD3>}之前显示了^ {< CD1>}参数(类型{{CD2>})。因此,似乎函数缺少一个参数。要接受win_stride的默认参数,您应该将问题中使用的加法参数作为关键字传递。

相关问题 更多 >