结果

基本实现了识别的功能。基本的界面如下

界面长得比较丑,主要是JavaSwing写界面比较麻烦,写个菜单栏都要那么多代码。目前不打算改了。

实现的思路是:使用opencv中自带的OpenCVFrameGrabber获取摄像头的数据,CanvasFrame来显示摄像头捕获的画面。

点击注册和识别都会在捕获的视频流自动抓取一帧图片,点下面的按钮可以查看拍摄效果

当输入想要比对的身份,点击识别之后,会与注册保存的数据进行比对

准确率还行。

附上部分代码

public static void OpenCamera()throwsException, InterruptedException{

OpenCVFrameGrabber grabber= new OpenCVFrameGrabber(0);//0表示本机摄像头 当然这里也可以换成网络摄像头地址

grabber.start(); //开始获取摄像头数据

CanvasFrame canvas = new CanvasFrame("倒计时5秒自动拍照注册");//新建一个窗口

canvas.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//窗口关闭时程序运行结束

canvas.setAlwaysOnTop(true);int i=0;while(true){if(i==30){//窗口是否关闭

System.out.println("已关闭");

grabber.stop();//停止抓取

canvas.dispose();//System.exit(2);//退出

}

canvas.showImage(grabber.grab());//获取摄像头图像并放到窗口上显示, 这里的Frame frame=grabber.grab(); frame表示一帧视频图像//调用doExecuteFrame()方法,将截取的图片保存在本地

if(i==1)CatchPhoto(grabber.grabFrame(),"./register"+"/"+ MainWindow.ID +".jpg");

Thread.sleep(50);//50毫秒刷新一次图像

i++;

}

}

//人脸检测

ImageInfo imageInfo = getRGBData(newFile(register));

List faceInfoList = new ArrayList();

errorCode=faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);

System.out.println(faceInfoList);//特征提取

FaceFeature faceFeature = newFaceFeature();

errorCode= faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);

System.out.println("特征值大小:" +faceFeature.getFeatureData().length);//人脸检测2

ImageInfo imageInfo2 = getRGBData(newFile(discern));

List faceInfoList2 = new ArrayList();

errorCode=faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo.getImageFormat(), faceInfoList2);

System.out.println(faceInfoList);//特征提取2

FaceFeature faceFeature2 = newFaceFeature();

errorCode= faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo.getImageFormat(), faceInfoList2.get(0), faceFeature2);

System.out.println("特征值大小:" +faceFeature.getFeatureData().length);//特征比对

FaceFeature targetFaceFeature = newFaceFeature();

targetFaceFeature.setFeatureData(faceFeature.getFeatureData());

FaceFeature sourceFaceFeature= newFaceFeature();

sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());

FaceSimilar faceSimilar= newFaceSimilar();

errorCode=faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);//System.out.println("相似度:" + faceSimilar.getScore());

MainWindow.Similarity.setText("相似度:" +faceSimilar.getScore());//设置活体测试

errorCode = faceEngine.setLivenessParam(0.5f, 0.7f);//人脸属性检测

FunctionConfiguration configuration = newFunctionConfiguration();

configuration.setSupportAge(true);

configuration.setSupportFace3dAngle(true);

configuration.setSupportGender(true);

configuration.setSupportLiveness(true);

errorCode=faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, configuration);//性别检测

List genderInfoList = new ArrayList();

errorCode=faceEngine.getGender(genderInfoList);//System.out.println("性别:" + genderInfoList.get(0).getGender());

if(genderInfoList.get(0).getGender()==0){

MainWindow.Sex.setText("性别:男");

}else if(genderInfoList.get(0).getGender()==1){

MainWindow.Sex.setText("性别:女");

}else{

MainWindow.Sex.setText("性别:未知");

}//MainWindow.Sex.setText("性别:" + genderInfoList.get(0).getGender());//年龄检测

List ageInfoList = new ArrayList();

errorCode=faceEngine.getAge(ageInfoList);//System.out.println("年龄:" + ageInfoList.get(0).getAge());

MainWindow.Age.setText("年龄:" + ageInfoList.get(0).getAge());//3D信息检测

List face3DAngleList = new ArrayList();

errorCode=faceEngine.getFace3DAngle(face3DAngleList);

System.out.println("3D角度:" + face3DAngleList.get(0).getPitch() + "," + face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());

MainWindow.Angle.setText("3D角度:" + face3DAngleList.get(0).getPitch() + "," + face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());//活体检测

List livenessInfoList = new ArrayList();

errorCode=faceEngine.getLiveness(livenessInfoList);//System.out.println("活体:" + livenessInfoList.get(0).getLiveness());

MainWindow.LiVing.setText("活体:" + livenessInfoList.get(0).getLiveness());//IR属性处理

ImageInfo imageInfoGray = getGrayData(new File("C:\\Users\\user\\Desktop\\test\\photo\\1.jpg"));

List faceInfoListGray = new ArrayList();

errorCode=faceEngine.detectFaces(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray);

FunctionConfiguration configuration2= newFunctionConfiguration();

configuration2.setSupportIRLiveness(true);

errorCode=faceEngine.processIr(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray, configuration2);//IR活体检测

List irLivenessInfo = new ArrayList<>();

errorCode=faceEngine.getLivenessIr(irLivenessInfo);

System.out.println("IR活体:" + irLivenessInfo.get(0).getLiveness());

ImageInfoEx imageInfoEx= newImageInfoEx();

imageInfoEx.setHeight(imageInfo.getHeight());

imageInfoEx.setWidth(imageInfo.getWidth());

imageInfoEx.setImageFormat(imageInfo.getImageFormat());

imageInfoEx.setImageDataPlanes(new byte[][]{imageInfo.getImageData()});

imageInfoEx.setImageStrides(new int[]{imageInfo.getWidth() * 3});

List faceInfoList1 = new ArrayList<>();

errorCode=faceEngine.detectFaces(imageInfoEx, DetectModel.ASF_DETECT_MODEL_RGB, faceInfoList1);

FunctionConfiguration fun= newFunctionConfiguration();

fun.setSupportAge(true);

errorCode=faceEngine.process(imageInfoEx, faceInfoList1, functionConfiguration);

List ageInfoList1 = new ArrayList<>();int age =faceEngine.getAge(ageInfoList1);

System.out.println("年龄:" + ageInfoList1.get(0).getAge());

FaceFeature feature= newFaceFeature();

errorCode= faceEngine.extractFaceFeature(imageInfoEx, faceInfoList1.get(0), feature);

问题记录

1.捕获视频流

网上找到了很多方法,比如JMF、ffmpeg等。JMF以前用过,过于老旧了,而且只支持32位系统,想用的话还得用32位的IDE,所以忽略。然后发现用opencv集成了ffmpeg,通过grabber.grab()方法就可以获取。很简单。

2.视频显示

一开始的想法,grabber.grab()获取的是一帧一帧的图片,那么可以再frame里加一个显示图片的label,每过十毫秒刷新一次图片,这样就起到了播放视频的效果。但是遇到了问题

使用java.awt.Image 中的方法无法获取grabber.grab()中的数据,强制类型转换无效。后来查看OpenCVFrameGrabber的源码。最后在Frame.Class里发现image的类型

NIO与IO之间是有一些区别的,NIO要更优秀一点,可惜Java界面没有

所以转换思路,没办法在主窗口播放,那就在新建一个窗口,看起来有点别扭,但受限于技术水平,还是先把功能实现了。

javacv里有一个简单的新建窗口方式

CanvasFrame canvas = new CanvasFrame("Camera");//新建一个窗口

通过源码可以看到CanvasFrame是继承了javax.swing.JFrame类的。使用这个类主要是它里面的showimage方法

里面有适合的数据类型。

3.窗口问题

使用新建窗口显示视频时,关闭视频播放窗口,主窗口也会关闭。

原来关闭窗口使用的是System.exit(0);这个方法直接终止了虚拟机。后来改成了dispose()方法(需要.setDefaultCloseOperation设置为JFrame.DISPOSE_ON_CLOSE)

java opencv 人脸相似度_java+opencv实现人脸识别程序记录相关推荐

  1. java 文本的相似度_java – 文本相似度算法

    我正在做一个Java项目,我必须做一个文本相似程序.我想要采取2个文本文档,然后将它们相互比较并获得相似之处.他们是如何相似的. 我稍后会放一个已经有数据库的人可以找到这些单词的同义词,并通过文本来查 ...

  2. java编写类骑士游历_java课程设计骑士游历程序的开发

    java课程设计骑士游历程序的开发 JAVA程序设计 课程设计报告 课 题: 骑士游历程序的开发 姓 名: 学 号: 同组姓名: 专业班级: 指导教师: 设计时间: 2013.06.10 评阅意见: ...

  3. Java实例化后自动执行_Java的实例化顺序(程序执行顺序)

    加载/执行顺序: 牢记一点: 静态和非静态分开处理 使用到静态加载时,静态又分为: 静态变量, 静态代码块, 其中加载顺序是按照类中书写的先后顺序加载的 非静态加载顺序: 按照非静态书写顺序加载/执行 ...

  4. java继承父类执行顺序_java中子类继承父类程序执行顺序问题

    Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...

  5. Java图形编程实验总结_JAVA实验报告简单绘图程序

    <JAVA实验报告简单绘图程序>由会员分享,可在线阅读,更多相关<JAVA实验报告简单绘图程序(8页珍藏版)>请在人人文库网上搜索. 1.实验三绘制图形一.实验目的学会JBut ...

  6. java语义事件的含义_Java基础之处理事件——应用程序中的语义事件监听器(Sketcher 5 with element color listeners)...

    控制台程序. 为了标识元素的类型,可以为菜单已提供的4中元素定义常量,用作ID.这有助于执行菜单项监听器的操作,还提供了一种标识颜色类型的方式.我们会累积许多应用程序范围的常量,所以把它们定义为可以静 ...

  7. java杀死自身并重启_java – android服务在应用程序被杀死时自动重启

    我正在开发一个应用程序,通过接收器与我的服务进行通信. 服务代码 @Override public int onStartCommand(Intent intent, int flags, int s ...

  8. java实现OpenCV 4.1.0人脸相似度对比

    需要opencv的jar,从opencv的安装路径中可以获取. package com.ahies.dit.management.util;import org.opencv.core.*; impo ...

  9. java 人脸检测_Java+OpenCV实现人脸检测并自动拍照

    java+opencv实现人脸检测,调用笔记本摄像头实时抓拍,人脸会用红色边框标识出来,并且将抓拍的目录存放在src下,图片名称是时间戳. 环境配置:win7 64位,jdk1.8 CameraBas ...

  10. OpenCV Java入门六 使用神经网算法辩识人脸

    介绍 前面几章我们积累了足够的opencv使用技巧.这一章我们就会进入最激动人心的辩识人脸.我们知道识脸和辩识人脸有着本质的区别. 识脸:这是一个人的脸. 辩识人脸:这是谁的脸,这才是我们需要的. 我 ...

最新文章

  1. Linux中如何添加/删除FTP用户并设置权限
  2. tank html5,index.html
  3. Nginx静态资源优化配置之tcp_nopush和tcp_nodelay
  4. 求字符串里里面字符出现的次数和出现哪些不同的字符的字符串
  5. 【mysql的设计与优化专题(6)】mysql索引攻略
  6. 酒的基金降幅较大,这是为什么?
  7. 840万应届生创历史新高,企业大规模缩招,互联网行业首次出现需求负增长
  8. position有哪些属性?
  9. CakePHP中文手册【翻译】-ACL
  10. Hbuilder 屏幕放大缩小
  11. 计算机专业专转本题目(新考纲)
  12. Java扫雷游戏的设计与实现毕业设计论文
  13. PPPOE拨号下MTU设置
  14. 网易微专业产品经理 学习笔记 ——(1)产品经理之道
  15. Bill Gates和Elon Musk推荐,人工智能必读的三本书 -《终极算法》,《超级智能》和《终极发明》
  16. 北航991——设备管理(重点)
  17. 国内最快的jquery cdn
  18. Linux系统ISO镜像文件下载地址
  19. HDU 3507 斜率优化入学习
  20. 关于python语句p p_关于 Python 语句 P=-P ,哪个选项的描述是正确的?_纳税实务答案_学小易找答案...

热门文章

  1. 网页在线沟通工具,网页即时聊天工具-ttkefu完全免费电话呼叫流程图
  2. 最新emoji表情代码大全_如何给微信公众号菜单添加emoji(亲测有效)
  3. 学生a3制图标题栏尺寸手绘_AutoCAD教程之绘制图框和标题栏
  4. 2019年阿里最新java编程规范-在线版
  5. 富士施乐3065扫描教程_富士施乐怎么设置扫描到PC
  6. 漏洞扫描技术:对Web应用程序进行漏洞扫描
  7. 《信号与系统》(吴京)部分课后习题答案与解析——第七章(PART2)(系统及系统分析)
  8. tkinter教程目录
  9. java 企业微信对接_Java对接企业微信
  10. 带你极速掌握EMU8086汇编工具,深刻理解微机原理(含安装与快速上手教程)