opencv怎么做opencv人脸比对对?



用LBPH分类器上面的两次输出都分辨囸确但是用Eigen和Fisher两种分类识别器,在默认参数情况下上面的测试就都分类为1了,没有正常识别出来
测试样本是yale人像库的01和02号人像。

俗话说:不基于需求的敲代码都是耍流氓


首先需要准备人脸的训练数据,这个在官方的Github可以下载到,这里用:
然后有请世界上最傻最天真,最美丽最善良的Girl登场:


本想全用Kotlin写的,不过发现Kotlin竟然无法自动生成JNI函数...
但我又懒得找id,就混着用吧,使用TolyCV提供native方法



很多教程都把代码塞到JNI的cpp里,感觉看着太混乱太难受了
根据單一职责原则,这里定义一个FaceDetector类专门用于识别传入的图片数组
并通过detectorFace方法进行识别后返回识别到的结果集这样思路就清晰多了。

//识别矩陣返回脸的矩形列表
4.C++层进行方形的绘制,标识人脸

其实上面已经识别出人脸并到存到一个vector中。现在把它在图像上画出来

根据不同的模型数据可以检测到不同的部位,比如眼睛:
检测也会出现误差此时可以通过一些判断来筛选结果,比如先检测人脸之外的部分可以过濾
或者根据两眼间距,计算出不可能的矩形将其剔除,这也是图片识别比较好玩的地方


现在需求是:根据一张照片(尺寸任意)截取人脸及周围,并裁成规定的尺寸如两寸:413*626 就像这样:


新定义一个native方法faceDetectorResize方法进行执行该功能,返回一个处理过的图片


这里只针对一个人脸,多个人脸可以采取问题分化的思想。
首先要解决的是区域的问题:这个Rect是何许人也?如果你对一个对象有疑惑debug是不二人选

知道这些信息,就很容易构建目标區域(红色区域),剩下的就是裁切红色区域了


Mat类重载()运算符可以传入一个矩形,实现是通过构造生成一个新Mat
这样就完成了既定比例的裁切并保证人脸始终在中上部。

另外有一点需要注意:当矩形范围超出Mat会报错,应该可以通过添白来处理,Mark一下


最后只剩重设尺寸了,注意把你画的矩形线给去掉,不然会输出到结果中

OK,打完收工再也不怕妹子让我帮她设置图片尺寸了。
对于大批量形形色色的人物照片,想要裁剪规整一个for循环搞定,程序是绝佳劳动力

我要回帖

更多关于 opencv人脸比对 的文章

 

随机推荐