Android使用OpenCV实现「人脸检测」和「人脸识别」

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

完整开源地址:https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF

P1

目录:

  • apk:Manager的apk

  • doc:一些文档

  • samples:示例工程和一些编译好的apk

  • sdk:一些库文件

当然, 如果你的C/C++足够好,你肯定可以自己编译一个库,直接导入到工程,就不用安装Manager了,可惜了我自己还不行,哈哈……无奈安装Manager把……

如何将Demo导入到Eclipse并运行,上面官方的文档已经说的比较清楚了,至于会有什么问题就自行Google吧。

人脸检测


其实人脸检测并不是重点,Demo里已经实现了人脸检测的功能。

主要的实现方式:OpenCV有一个自己的org.opencv.android.JavaCameraView自定义控件,它循环的从摄像头抓取数据,在回调方法中,我们能获取到Mat数据,然后通过调用OpenCV的Native方法,检测当前是否有人脸,我们会获取到一个Rect数组,里面会有人脸数据,最后将人脸画在屏幕上,到此为止,Demo的人脸检测功能,就结束了。

人脸识别


人脸识别我这里用到了JavaCV

P2

人脸识别逻辑:人脸识别的主要方式就是获取到人脸的特征值,然后将两个特征值做比对,取到一个相似度去做人脸识别,OpenCV这里的特征值,其实就是一张图片。

我们的从回调的Mat数据检测到有人脸以后,提取特征值(也就是保存人脸的一张图片到某个路径),然后比较特征值

为了提高识别的准确度,需要在检测到人脸以后,把人脸的部分截取出来,然后置灰(置灰的目的是为了方式色泽和明暗度对识别有影响)。

保存人脸特征值


/**

 * 特征保存

 *

 * @param image    Mat

 * @param rect     人脸信息

 * @param fileName 文件名字

 * @return 保存是否成功

 */

public boolean saveImage(Mat image, Rect rect, String fileName) {

    try {

        String PATH = Environment.getExternalStorageDirectory() + "/FaceDetect/" + fileName + ".jpg";

        // 把检测到的人脸重新定义大小后保存成文件

        Mat sub = image.submat(rect);

        Mat mat = new Mat();

        Size size = new Size(100, 100);

        Imgproc.resize(sub, mat, size);

        Highgui.imwrite(PATH, mat);

        return true;

    } catch (Exception e) {

        e.printStackTrace();

        return false;

    }

}

提取特征值

之前已经说了嘛,人脸特征其实就是一张人脸图片,所以提取人脸特征其实就是获取一张人脸图片


/**

 * 提取特征

 *

 * @param fileName 文件名

 * @return 特征图片

 */

public Bitmap getImage(String fileName) {

    try {

        return BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/FaceDetect/" + fileName + ".jpg");

    } catch (Exception e) {

        e.printStackTrace();

        return null;

    }

}

人脸识别

这里主要使用了JavaCV的方法


/**

 * 特征对比

 *

 * @param file1 人脸特征

 * @param file2 人脸特征

 * @return 相似度

 */

public double CmpPic(String file1, String file2) {

    int l_bins = 20;

    int hist_size[] = {l_bins};



    float v_ranges[] = {0, 100};

    float ranges[][] = {v_ranges};



    opencv_core.IplImage Image1 = cvLoadImage(Environment.getExternalStorageDirectory() + "/FaceDetect/" + file1 + ".jpg", CV_LOAD_IMAGE_GRAYSCALE);

    opencv_core.IplImage Image2 = cvLoadImage(Environment.getExternalStorageDirectory() + "/FaceDetect/" + file2 + ".jpg", CV_LOAD_IMAGE_GRAYSCALE);



    opencv_core.IplImage imageArr1[] = {Image1};

    opencv_core.IplImage imageArr2[] = {Image2};


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值