关闭

OpenCV人脸检测的速度

标签: searchobject活动
3950人阅读 评论(5) 收藏 举报
分类:

OpenCV人脸检测的速度

帖子由 alkmaar » 2012-03-20 10:19

各位大虾好,小弟有一个关于OpenCV人脸检测的问题想请教一下:
我用摄像头打开480x640的窗口,然后使用OpenCV的人脸检测函数cvHaarDetectObjects进行人脸检测。函数配置如下:

faces = cvHaarDetectObjects( detectImg, (CvHaarClassifierCascade*)cascade, storage, search_scale_factor, 3, flags, minFeatureSize ); 

其中, search_scale_factor是1.1, flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH; 也就是说只找一张人脸。 minFeatureSize是(20,20)。
这样的配置在有人脸的情况下可以实时检测,大概就是十几ms的样子。

现在有一个问题是:当窗口没有人脸的时候,这个人脸检测函数貌似要搜索整幅图直至最终确定没有人脸。这种情况下大概需要近一秒的时间。小弟想问一下:这种情况正常吗?我以前看到别人的人脸检测demo程序在有没有人脸的情况下视频窗口都是实时活动的,不会像我的程序这样,在没有人脸的时候,当前帧得卡住,一直等到cvHaarDetectObjects执行完。请问,是不是我的函数配置有问题啊?

烦请大虾不吝赐教,谢谢啊。


我来回复楼下评论各位:(2014-08-06)

search_scale_factor 弄大一点,比如1.3
minFeatureSize是(20,20)弄大一点,比如50 * 50


这个opencv内部检测过程,我武断的推理一下,就是先找大的,先大的套一个框,框内部图像内容通过直方图等方法检测是否可能是脸。


大的找不到咋办,把框弄小一点(我估计那个1.1的参数用在这里),先套在一个位置检查,不行就把框步进移动一下,得到新框范围接着检查。


如果步进完了还没有咋办,再用1.1参数缩小一点。直到小于minFeatureSize终止检测。


所以,如果图像里面有头像,速度比较快,因为很快找到。如果图像里面没有头像,就每次都检测完所有的框,就会很卡。


一些捡的比较快的技术,就是用了历史来检测,例如上一帧在x, y附件有脸,这一帧或几帧后也在x, y附近先找。找不到再适当放大一点,缩小一点啥的。


如果都找不到,就放慢检测速度,比如这帧检测检查大框,下帧检测中框,再下次检测小框。总之就是避免卡。


因为脸首次检测灵敏度慢点没问题的,检测到了后跟踪的好,其用户体验才是真的好。


可惜,opencv流行的用法只会蛮力,没头像时贼卡。


还有一个最简单的方式,把图像缩小,尽可能缩小(就是勉强满足检测灵敏度就行),再给opencv检测(显示时还是大图,小图若检测到脸,需要按比例找到在大图中的位置)。这个方法我用过,好用,配合那个参数调整,基本不会觉得卡的。




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1880383次
    • 积分:19684
    • 等级:
    • 排名:第421名
    • 原创:9篇
    • 转载:1263篇
    • 译文:24篇
    • 评论:26条
    最新评论