前几天逛知乎看到有免费的工具来做人脸识别,觉得很有意思;心血来潮,想自己也搞一个人脸识别;不得不说虹软ArcFace真的是太好用了;对于我这种完全不懂人脸识别算法的人,也可以构建出人脸识别的应用;只需要调用封装好的API就行了。
环境准备:

  • 1.到虹软ArcFace官网下载虹软ArcFacezip格式的压缩文件,解压后将libs文件夹copy到自己的工程下,注意libs文件下有一个:arcsoft-sdk-face-3.0.0.0.jar,添加工程对jar的路径依赖;
  • 2.maven下载opencv;
    <!--opencv--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.4.1</version></dependency><dependency><groupId>org.bytedeco.javacpp-presets</groupId><artifactId>opencv-platform</artifactId><version>3.4.1-1.4.1</version></dependency><!-- jna:调用windows系统的API~--><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.8.0</version></dependency><dependency><groupId>net.java.dev.jna</groupId><artifactId>jna-platform</artifactId><version>5.8.0</version></dependency>

项目的结构:

arcFace

从官方下载的zip文件节后,samplecode文件夹下FaceEngineTest.java是官方给出的示例代码;下面是人脸特征对比部分的代码:

        //从官网获取String appId = "";String sdkKey = "";//加载dll文件,就是最开始准备的libs下面的dll文件路径;      FaceEngine faceEngine = new FaceEngine("E:/Project/2021/face-learning/libs/WIN64");//激活引擎int errorCode = faceEngine.activeOnline(appId, sdkKey);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {System.out.println("引擎激活失败");}ActiveFileInfo activeFileInfo=new ActiveFileInfo();errorCode = faceEngine.getActiveFileInfo(activeFileInfo);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {System.out.println("获取激活文件信息失败");}//引擎配置EngineConfiguration engineConfiguration = new EngineConfiguration();engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);engineConfiguration.setDetectFaceMaxNum(10);engineConfiguration.setDetectFaceScaleVal(16);//功能配置FunctionConfiguration functionConfiguration = new FunctionConfiguration();functionConfiguration.setSupportAge(true);functionConfiguration.setSupportFace3dAngle(true);functionConfiguration.setSupportFaceDetect(true);functionConfiguration.setSupportFaceRecognition(true);functionConfiguration.setSupportGender(true);functionConfiguration.setSupportLiveness(true);functionConfiguration.setSupportIRLiveness(true);engineConfiguration.setFunctionConfiguration(functionConfiguration);//初始化引擎errorCode = faceEngine.init(engineConfiguration);if (errorCode != ErrorInfo.MOK.getValue()) {System.out.println("初始化引擎失败");}//人脸检测ImageInfo imageInfo = ImageFactory.getRGBData(new File("C:\\Users\\Pictures\\b0488b9ed27271eab692bd0097fe67ce.jpeg"));List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);System.out.println(faceInfoList);//特征提取FaceFeature faceFeature = new FaceFeature();errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);System.out.println("特征值1大小:" + faceFeature.getFeatureData().length);//人脸检测2ImageInfo imageInfo2 = ImageFactory.getRGBData(new File("C:\\Users\\Pictures\\WIN_20210628_13_25_19_Pro.jpg"));List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo.getImageFormat(), faceInfoList2);System.out.println(faceInfoList);//特征提取2FaceFeature faceFeature2 = new FaceFeature();errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo.getImageFormat(), faceInfoList2.get(0), faceFeature2);System.out.println("特征值2大小:" + faceFeature2.getFeatureData().length);//特征比对FaceSimilar faceSimilar = new FaceSimilar();errorCode = faceEngine.compareFaceFeature(faceFeature, faceFeature2, faceSimilar);System.out.println("相似度:" + faceSimilar.getScore());

上面这段代码流程:

  • 1.FaceEngine引擎 对象创建(加载dll文件)
  • 2.激活引擎
  • 3.引擎配置,功能配置
  • 4.初始化引擎
  • 5.分别做2张图片的:人脸检测:imageInfo(人脸信息),特征提取:faceFeatur(人脸特征)
  • 6.对比2张图片的人脸特征,得出相似度FaceSimilar

opencv

用opencv调用摄像头,获取实时的人脸信息;

OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);Java2DFrameConverter converter =  new Java2DFrameConverter();grabber.start();   //开始获取摄像头数据Frame frame = grabber.grab();//获取此刻的图像数据BufferedImage bufferedImage = converter.convert(frame);//opencv:用Java2DFrameConverter将Frame转化成BufferedImage ImageInfo imageInfo =ImageFactory.bufferedImage2ImageInfo(bufferedImage);//ArcFace:获取到人脸信息;

opencv_ArcFace

将上面的代码整合一下


public class TestArcFace{static  String appId = "";static String sdkKey = "";static String enginePath ="E:/Project/2021/face-learning/libs/WIN64";static OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);static Java2DFrameConverter converter =  new Java2DFrameConverter();public static void main(String[] args) throws Throwable{FaceEngine faceEngine = getFaceEngine();//获取FaceEnginegrabber.start();//开启摄像头FaceFeature bossFace = getFaceFeature(faceEngine,getImageInfoFromPicture("")).get(0);//从boss的单人照中获取boss脸部特征boolean bossComing=false;while(!bossComing){//检测boss是否出现摄像头中;List<FaceFeature> captureFaces  = getFaceFeature(faceEngine,getImageInfoFromCamera());//捕获出现在镜头中的人脸特征for (FaceFeature captureFace : captureFaces) {//遍历list检测捕获到的人脸特征FaceSimilar faceSimilar = getFaceSimilar(faceEngine,captureFace,bossFace);if(samePeople(faceSimilar,0.8f)){//boss出现bossComing=true;break;}}Thread.sleep(100);//每隔100ms检测一次,检测boss是否出现在镜头中。。}User32.INSTANCE.LockWorkStation();//锁屏grabber.stop();faceEngine.unInit();
}public static FaceEngine getFaceEngine(){FaceEngine faceEngine = new FaceEngine(enginePath);int errorCode = faceEngine.activeOnline(appId, sdkKey);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {System.out.println("引擎激活失败");}ActiveFileInfo activeFileInfo=new ActiveFileInfo();errorCode = faceEngine.getActiveFileInfo(activeFileInfo);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {System.out.println("获取激活文件信息失败");}//引擎配置EngineConfiguration engineConfiguration = new EngineConfiguration();engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);engineConfiguration.setDetectFaceMaxNum(10);//图片中人脸数engineConfiguration.setDetectFaceScaleVal(30);//人脸相对于所在图片的长边的占比,建议16//功能配置FunctionConfiguration functionConfiguration = new FunctionConfiguration();functionConfiguration.setSupportAge(true);functionConfiguration.setSupportFace3dAngle(true);functionConfiguration.setSupportFaceDetect(true);functionConfiguration.setSupportFaceRecognition(true);functionConfiguration.setSupportGender(true);functionConfiguration.setSupportLiveness(true);functionConfiguration.setSupportIRLiveness(true);engineConfiguration.setFunctionConfiguration(functionConfiguration);//初始化引擎errorCode = faceEngine.init(engineConfiguration);if(ErrorInfo.MOK.getValue()!= errorCode){throw new RuntimeException("初始化引擎失败。。。errorCode:"+errorCode);}return faceEngine;}/*获取图片中人脸信息*/public static ImageInfo getImageInfoFromPicture(String picturePath){return ImageFactory.getRGBData(new File(picturePath));}/*从摄像头中获取到人脸信息;*/public static ImageInfo getImageInfoFromCamera() throws FrameGrabber.Exception {Frame frame = grabber.grab();BufferedImage bufferedImage = converter.convert(frame);return ImageFactory.bufferedImage2ImageInfo(bufferedImage);}/*获取ImageInfo人脸特征*/public  static List<FaceFeature> getFaceFeature(FaceEngine faceEngine,ImageInfo imageInfo){List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();List<FaceFeature> faceFeatures = new ArrayList<>();//提取人脸信息faceEngine.detectFaces(imageInfo.getImageData(),imageInfo.getWidth(),imageInfo.getHeight(),imageInfo.getImageFormat(),faceInfoList);if(!faceInfoList.isEmpty()){//提取人脸特征for (FaceInfo faceInfo : faceInfoList) {FaceFeature faceFeature = new FaceFeature();faceEngine.extractFaceFeature(imageInfo.getImageData(),imageInfo.getWidth(),imageInfo.getHeight(),imageInfo.getImageFormat(),faceInfo,faceFeature);faceFeatures.add(faceFeature);}}else{System.out.println("faceInfoList is empty");}return faceFeatures;}/*对比FaceFeature,获取相似度*/public static FaceSimilar getFaceSimilar(FaceEngine faceEngine,FaceFeature captureFaceFeature,FaceFeature target){FaceSimilar faceSimilar = new FaceSimilar();faceEngine.compareFaceFeature(captureFaceFeature,target,faceSimilar);return faceSimilar;}/*判断是否是同一个人,score:自定义设置 ;当相似度超过score,判定是同一人;*/public static boolean samePeople(FaceSimilar faceSimilar,float score){return faceSimilar.getScore()>score?true:false;}}

opencv+ArcFace人脸识别相关推荐

  1. 怎样使用OpenCV进行人脸识别

    不断维护的地址:http://plzcoding.com/face-recognition-with-opencv/ 怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Re ...

  2. Java使用OpenCV实现人脸识别

    通过OpenCV实现人脸识别,包括图片,视频,摄像头中人脸识别. 首先看一下效果(在网上随便找的一张图片): 下面开始说一下如何实现的: 第一步:  需要安装OpenCV 下载链接:https://o ...

  3. python使用opencv实现人脸识别系统

    1.首先安装过python环境,在这里就不过说    检测是否安装成功如下,在cmd中输入Python     2.安装numpy 现在开始安装numpy,打开cmd,输入pip install nu ...

  4. 基于OpenCV实现人脸识别--Python

    目录 前言 第一章 OpenCV介绍 第二章 功能描述 2.1 对已有的数据进行检测 2.2 陌生人检测并发出警告 2.3 保存陌生人的视频 2.4 输入图片进行检测 2.5 现场录用信息 第三章 功 ...

  5. java调起本地摄像头,利用openCV进行人脸识别(一)

    嗨咯,又好久没有更新了.今天写个前阵子做的人脸识别程序.该程序客户端基于Jave JFrame 客户端的主要作用是,调用电脑的摄像头(我的直接调用笔记本摄像头),然后回显摄像头录取的信息,再利用ope ...

  6. python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片)

    首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import ...

  7. opencv + face_recognition —— 人脸识别案例

    文章目录 opencv + face_recognition -- 人脸识别案例 0. 版本信息 1. 导包 2. 识别图片中的面部 3. 实现摄像头中的面部追踪 4. 人脸追踪+识别,分析出不同的人 ...

  8. 树莓派与OpenCV实现人脸识别(OpenCV安装篇)

    主要看了以下两位博客的文章完成的,也遇到了不少的坑,在这里一一填补说明. 链接: https://blog.csdn.net/weixin_42163073/article/details/10730 ...

  9. 使用OpenCV进行人脸识别的三种算法(官方网翻译)

    怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Reconition with OpenCV这节内容(http://docs.opencv.org/modules/con ...

  10. 基于OpenCV的人脸识别自助商店(源码&部署视频)

    1.模块功能介绍 实现人脸识别模块.人脸登录与注册功能.商店显示和用户余额页显示功能 用GUl图形界面实现(pyqt)语言python windows下软件pycharm 1.用户登录模块:刷脸登录 ...

最新文章

  1. FeiBoStr 斐波那契
  2. 自定义MyBatis
  3. Linux文件系统保存在哪里,文件系统保存在磁盘的()
  4. shadows a parameter
  5. Java发送Post请求,参数JSON,接收JSON
  6. 3年出货5000万颗!国内老牌芯片商用平头哥玄铁处理器研发新芯片
  7. [linux]解决DNS配置重启丢失
  8. 群同态基本定理证明_群同态基本定理II
  9. Linux运维基础入门(二):网络基础知识梳理02
  10. 走进内存,走进汇编指令来看C/C++指针
  11. 数值分析(7)-正交多项式
  12. hdu 3879 Base Station
  13. python依次输入输出字符串_python 学习笔记(基础输入输出,字符串,循环,三种数组)...
  14. 大数据服务器迁移步骤及介绍
  15. C语言 | 什么是ANSI C标准?
  16. 人造肌肉——双扭绳驱动结构
  17. 房讯房屋租赁管理软件新版上线 专为房东朋友定制
  18. Python今日编程——判断水仙花数然后求水仙花数
  19. APP开发应注意的几点
  20. print('两数之和为 %.1f' %(float(input('输入第一个数字:'))+float(input('输入第二个数字:'))))...

热门文章

  1. 计算机怎么语音通话,微信电脑版怎么语音聊天?微信电脑版语音聊天教程
  2. fullpage实现单页面全屏网站
  3. ora 01033 oracle initialization,ora-01033:oracle initialization or shutdown in progress 解决方法
  4. matlab拉格朗日kkt,深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
  5. 【安全测试工具】Drozer介绍及使用
  6. 小程序倒计时实现方法
  7. 小新pro13 archlinux 显卡 声卡 驱动安装
  8. python自动视频剪辑_自动剪辑视频神器(适合自动剪 Vlog、视频教程等)
  9. 前端常见的几种布局方式
  10. php获取当前网址附带(http://或者https//)