HOGDescriptor 带有视频以识别对象
Posted
技术标签:
【中文标题】HOGDescriptor 带有视频以识别对象【英文标题】:HOGDescriptor with videos to recognize objects 【发布时间】:2013-01-02 06:14:24 【问题描述】:不幸的是,我既是 python 又是 openCV 初学者,如果问题很愚蠢,请见谅。
我正在尝试使用cv2.HOGDescriptor
来识别视频中的对象。我关心的是逐帧识别(即没有跟踪)。
这是我正在做的:
我通过使用
阅读了视频(目前是.mpg
)
capture = cv.CreateFileCapture(video_path) #some path in which I have my video
#capturing frames
frame = cv.QueryFrame(capture) #returns cv2.cv.iplimage
为了最终在框架上使用检测器(我会使用
found, w = hog.detectMultiScale(frame, winStride, padding, scale)
) 我想我需要将 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
我真的不明白哪个元素是这里真正的问题。 IE。哪个数字应该是浮点数?
任何帮助表示赞赏
【问题讨论】:
【参考方案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
参数传递。
是的,你的线索是对的!您可能希望在您的答案中包含您的最后一条评论,以方便其他用户找到答案。基本上问题是我停止将参数作为关键字传递。我的超级菜鸟。谢谢以上是关于HOGDescriptor 带有视频以识别对象的主要内容,如果未能解决你的问题,请参考以下文章
TSINGSEE青犀视频开发AI识别对接大华AI设备以通道或者库为对象布控的流程介绍
训练自定义 SVM 以在 OpenCV 中与 HOGDescriptor 一起使用