我用CV我自豪。

———————————————————————————————————CTRL+V,我能。...

OpenCV人脸检测的速度

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检测(显示时还是大图,小图若检测到脸,需要按比例找到在大图中的位置)。这个方法我用过,好用,配合那个参数调整,基本不会觉得卡的。




阅读更多
文章标签: search object 活动
个人分类: 非iPhone
上一篇年龄计算器,如何算出20年后的你?(以及秃头计算器)
下一篇大家是否有办法提高haarObjectDetect的速度?在人脸检测方面,我尝试用肤色检测缩小范围
想对作者说点什么? 我来说一句

人脸检测库(高精度和速度

2015年12月25日 198KB 下载

没有更多推荐了,返回首页

关闭
关闭