OpenCVCheck

项目地址:SOFTPOWER1991/OpenCVCheck

简介: OpenCV 人脸识别、图片相似度检测

更多:作者   提 Bug

标签:

OpenCV 人脸识别、图片相似度检测

检测任意两张图片的相似度思路

  1. 加载两张图片为 bitmap 进入内存
  2. 将内存中的两张图片 bitmap 转换为 Mat 矩阵(Mat 类是 OpenCV 最基本的一个数据类型,它可以表示一个多维的多通道的数组。Mat 常用来存储图像,包括单通道二维数组——灰度图,多通道二维数组——彩色图)
  3. 把 Mat 矩阵的 type 转换为 Cv_8uc1(1 通道 8 位矩阵)类型,然后转换为 Cv_32F, 因为在 c++代码中会判断他的类型。
  4. 通过 OpenCv 来进行俩个矩阵的比较(俩个矩阵必须一样大小的高宽)

识别图片中是否有人脸思路

  1. 需要一个人脸的 Haar 特征分类器就是一个 XML 文件,该文件中会描述人脸的 Haar 特征值,CascadeClassifier 人脸探测器将该特征值集合加载入内存
  2. 加载图片为 bitmap 进入内存,将 bitmap 转换为 Mat 矩阵。
  3. 有了 Mat 矩阵,然后通过调用 OpenCV 的 Native 方法,人脸探测器 CascadeClassifier 在该 Mat 矩阵中检测当前是否有人脸。
  4. 如果有,我们会获取到一个 Rect 数组,里面会有人脸数据,然后将人脸画在屏幕上,方框或者圆形

识别两张图片中的人脸是否是同一个人脸思路

  1. 识别出人脸后会得到两个人脸的 Rect 数组,然后比较这两个 Rect 数组的相似度即可!

实现步骤

工程目录准备

  1. 新建 Android Studio 项目 OpenCVCheck
  2. 导入 OpenCVLibrary320
  3. 在 module 下的 build.gradle 中引入 OpenCVLibrary 的编译:

      compile project(':openCVLibrary320')
    

检测任意两张图片的相似度的实现步骤

  1. 初始化 OpenCV:

     static {if (OpenCVLoader.initDebug()) {Log.e(TAG, "OpenCV load success !");} else {Log.e(TAG, "OpenCV load failed !");}}
    
  2. 加载两张图片进入内存

     Bitmap mBitmap1 = BitmapFactory.decodeResource(getResources(), R.mipmap.pic1);Bitmap mBitmap2 = BitmapFactory.decodeResource(getResources(), R.mipmap.pic2);
    
  3. 将内存中的两张图片 bitmap 转换为 Mat 矩阵

     Mat mat1 = new Mat();Mat mat2 = new Mat();Mat mat11 = new Mat();Mat mat22 = new Mat();Utils.bitmapToMat(mBitmap1, mat1);Utils.bitmapToMat(mBitmap2, mat2);Imgproc.cvtColor(mat1, mat11, Imgproc.COLOR_BGR2GRAY);Imgproc.cvtColor(mat2, mat22, Imgproc.COLOR_BGR2GRAY);
    
  4. 把 Mat 矩阵的 type 转换为 Cv_8uc1(1 通道 8 位矩阵)类型,然后转换为 Cv_32F,通过 OpenCV 来进行俩个矩阵的比较

     /*** 比较来个矩阵的相似度** @param srcMat* @param desMat*/public void comPareHist(Mat srcMat, Mat desMat) {srcMat.convertTo(srcMat, CvType.CV_32F);desMat.convertTo(desMat, CvType.CV_32F);double target = Imgproc.compareHist(srcMat, desMat, Imgproc.CV_COMP_CORREL);textView.setText("相似度:" + target);}
    

识别图片中是否有人脸步骤

  1. 初始化 OpenCV

     if (!OpenCVLoader.initDebug()) {Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, this, mLoaderCallback);} else {Log.d(TAG, "OpenCV library found inside package. Using it!");mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);}
    
  2. 编译 .so 库

    通过 ndk 来编译 jni 文件下的.cpp 文件,生成.so 库,以备程序使用

  3. 加载.so 库

          // 在 Opencv 初始化完成后,调用 Native 库System.loadLibrary("detection_based_tracker");
    
  4. 加载需要的人脸的 Haar 特征分类器就是一个 XML 文件,该文件中会描述人脸的 Haar 特征值

    ``` private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {

        @Overridepublic void onManagerConnected(int status) {switch (status) {case LoaderCallbackInterface.SUCCESS: {Log.i(TAG, "OpenCV loaded successfully");// Load native library after(!) OpenCV initializationSystem.loadLibrary("detection_based_tracker");try {// load cascade file from application resourcesInputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");FileOutputStream os = new FileOutputStream(mCascadeFile);byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {os.write(buffer, 0, bytesRead);}is.close();os.close();mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());if (mJavaDetector.empty()) {Log.e(TAG, "Failed to load cascade classifier");mJavaDetector = null;} elseLog.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);cascadeDir.delete();} catch (IOException e) {e.printStackTrace();Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);}
    
               }break;default: {super.onManagerConnected(status);}break;}}};
```
  1. 加载图片进入内存,得到 Mat 矩阵,有了 Mat 矩阵,然后通过调用 OpenCV 的 Native 方法,人脸探测器 CascadeClassifier 在该 Mat 矩阵中检测当前是否有人脸

              Bitmap imgtemp = BitmapFactory.decodeResource(getResources(), R.mipmap.twop);Utils.bitmapToMat(imgtemp, mRgba);Mat mat1 = new Mat();Utils.bitmapToMat(imgtemp, mat1);Imgproc.cvtColor(mat1, mGray, Imgproc.COLOR_BGR2GRAY);if (mAbsoluteFaceSize == 0) {int height = mGray.rows();if (Math.round(height * mRelativeFaceSize) > 0) {mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);}mNativeDetector.setMinFaceSize(mAbsoluteFaceSize);}MatOfRect faces = new MatOfRect();if (mDetectorType == JAVA_DETECTOR) {if (mJavaDetector != null)mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, // TODO: objdetect.CV_HAAR_SCALE_IMAGEnew Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());} else if (mDetectorType == NATIVE_DETECTOR) {if (mNativeDetector != null)mNativeDetector.detect(mGray, faces);} else {Log.e(TAG, "Detection method is not selected!");}
    
  2. 如果有,我们会获取到一个 Rect 数组,里面会有人脸数据,然后将人脸画在屏幕上,方框或者圆形

      Rect[] facesArray = faces.toArray();for (int i = 0; i < facesArray.length; i++)Imgproc.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3);Utils.matToBitmap(mRgba, imgtemp, true);imageView.setImageBitmap(imgtemp);
    
## 识别两张图片中的人脸是否是同一个人脸步骤这个功能前面的步骤跟检测人脸的一样,唯一不同的就是:检测出两个人脸的 Rect 数组后,进行相似度比较:```/*** 特征对比** @param file1 人脸特征* @param file2 人脸特征* @return 相似度*/public double CmpPic(String file1, String file2) {try {int l_bins = 256;int hist_size[] = {l_bins};float v_ranges[] = {0, 255};float ranges[][] = {v_ranges};opencv_core.IplImage Image1 = cvLoadImage(getFilePath(file1), CV_LOAD_IMAGE_GRAYSCALE);opencv_core.IplImage Image2 = cvLoadImage(getFilePath(file2), CV_LOAD_IMAGE_GRAYSCALE);opencv_core.IplImage imageArr1[] = {Image1};opencv_core.IplImage imageArr2[] = {Image2};opencv_imgproc.CvHistogram Histogram1 = opencv_imgproc.CvHistogram.create(1, hist_size, CV_HIST_ARRAY, ranges, 1);opencv_imgproc.CvHistogram Histogram2 = opencv_imgproc.CvHistogram.create(1, hist_size, CV_HIST_ARRAY, ranges, 1);cvCalcHist(imageArr1, Histogram1, 0, null);cvCalcHist(imageArr2, Histogram2, 0, null);cvNormalizeHist(Histogram1, 100.0);cvNormalizeHist(Histogram2, 100.0);double c1 = cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL) * 100;double c2 = cvCompareHist(Histogram1, Histogram2, CV_COMP_INTERSECT);return (c1 + c2) / 2;} catch (Exception e) {e.printStackTrace();return -1;}}```

OpenCV 人脸识别、图片相似度检测相关推荐

  1. python+opencv人脸识别-图片处理+代码

    首先安装opencv: cmd 然后输入:install opencv-python 刚接触人脸识别,正在学习:代码是从绘制图片到人脸识别,里面的jpg图片找个有一个人脸图片就行,放在项目的根目录下就 ...

  2. 【opencv人脸识别1】从图片中检测人脸

    [opencv人脸识别一]从图片中检测人脸 本系列主要讲述利用opencv实现人脸识别的相关知识,并给出实际代码.且循序渐进,由基础到复杂,从最基本的图片检测人脸到视频检测.识别人脸,再到较大型人脸数 ...

  3. opencv人脸识别(二)人脸检测

    前面一文我们介绍了电脑打开摄像头,没基础的小伙伴可以点下面链接去看看 opencv人脸识别(一)调用笔记本摄像头 本文我将介绍opencv人脸检测,我使用的是LBP特征级联分类器,这个模型是2016年 ...

  4. python人脸照片分类_Python OpenCV 人脸识别(一)

    前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...

  5. python opencv人脸识别考勤系统的完整源码

    这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值. 代码如下: import wx import wx.g ...

  6. Python+opencv 人脸识别

    python+opencv人脸检测+识别示例及原理解析 一.开发环境搭建 二.图片人脸检测 2.1 文件准备与编程 2.2 注意事项 三.视频人脸识别 3.1文件准备与编程 3.2 注意事项 四.人脸 ...

  7. openCV人脸识别简单案例

    1 基础 我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器.我们需要从其中提取特征.下图中的 Haar 特征会被使用,就像我们的卷积核 ...

  8. OpenCV — 人脸识别

    前段时间弄过一下人脸识别相关的东西,记录一下 撰写不易,转载需注明出处:http://blog.csdn.net/jscese/article/details/54409627本文来自 [jscese ...

  9. OpenCV 人脸识别 源代码

    请直接查看原文 OpenCV 人脸识别 源代码 https://hotdog29.com/?p=553 在 2019年7月6日 上张贴 由 hotdog发表回复 opencv 人脸识别 在本教程中,您 ...

  10. 基于python opencv人脸识别的签到系统

    基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...

最新文章

  1. html javaScript 只能输入数字
  2. python写端口扫描器_使用Python编写简单的端口扫描器的实例分享
  3. 使用LinqToExcel读取Excel
  4. 在本地安装git的HTML帮助文档
  5. 课时 30:理解 RuntimeClass 与使用多容器运行时(贾之光)
  6. python import 原理-Python之禅-import this的实现
  7. Java扑克牌(enum)
  8. C语言学习之分别用if和switch编程,输入0-100分成绩,输出相应的成绩档次。
  9. Spring Boot面试题(2020最新版)
  10. mariadb mysql同步_MySQL(Mariadb)主从同步基础
  11. 用三元操作符替代if-else以降低CPU分支预测惩罚实现Unity内函数13倍提速
  12. matlab 人脸识别_MATLAB基于PCALDA模糊神经网络的人脸识别
  13. TensorFlow:字词的向量表示
  14. AndroidStudio是最难用的IDE,没有之一
  15. 如果同时需要两张表,但其中一个表中没有另一个表中的字段,该如何正确使用
  16. 高中计算机网络培训心得体会,高中老师信息技术培训心得体会
  17. Matlab 2019b AudioToolBox设备环境测试
  18. android小米手机变慢,小米安卓系统手机上网速度慢的解决方法
  19. ESLint中no-param-reassign错误
  20. speedoffice(word)如何给文字加粗

热门文章

  1. 一起学习“秋叶的如何成为PPT高手”
  2. 机器学习训练数据集图片标注工具推荐
  3. 关于数据中心PUE与计算机节能的探讨
  4. 2019年大数据发展将走向何方。
  5. zabbix—监控mysql数据
  6. Ubuntu查看联想笔记本无线网卡内核并安装驱动
  7. 【阿里图标库的使用】
  8. Python修改文件后缀名
  9. Confluence OGNL表达式注入漏洞复现与分析(CVE-2022-26134)
  10. proj编译linux,安装OpenProj配置中文显示