javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码)

文章目录

  • javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码)
  • 前言
  • 一、摄像头部分代码块
    • 1.controller层
    • 2.service层(service层分三层讲,第一层:保存图片;第二层:保存视频;第三层:打开摄像头)
      • 2.1保存图片
      • 2.2保存视频
      • 2.3页面打开摄像头
  • 二、运行结果
  • 总结

前言

最近领导让做一个人脸识别项目,在网上找了一个虹软的人脸识别demo,留意了一下,然后再将人脸识别搞完之后,重新下了一个人脸识别服务端完整demo,配置好app_idsdk_key之后,(没有虹软app_id和不会配置的同学请点击),项目正常运行,demo原有的功能如下:


提示:今天我主要的目的是说一下开启本地摄像头进行人脸识别,有兴趣的同学自己试一下上面的功能。
(注意视频流识别可能需要在手机或者电脑上旋转保存再播放、或者在代码读到某一帧图片的时候,进行旋转,才能识别出来,因为目前只能识别正脸)
项目源码在文章最下方。
保存图片比较简单,在images文件夹下保存自己的照片,再在FaceController的 如下代码下加入自己的数据就可以了,比如我是小明,我就加一个我的图片,在重启一下项目,照片就加载到内存缓存中了。

fileMap.put(“xiaoming”, “小明”);

一、摄像头部分代码块

1.controller层

/*** 打开摄像头进行人脸识别/保存人脸图片/保存人脸视频* @param response* @throws Exception*/@GetMapping(value = "/streamCamera")public void streamCamera(HttpServletResponse response) throws Exception {videoPlayerService.servletStreamPlayer(response);}

2.service层(service层分三层讲,第一层:保存图片;第二层:保存视频;第三层:打开摄像头)

2.1保存图片

public void servletStreamPlayer(HttpServletResponse response) throws Exception {//启动人脸处理引擎FacePreview faceProcessEngine = new FacePreview(appId, sdkKey);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);//新建opencv抓取器,一般的电脑和移动端设备中摄像头默认序号是0,不排除其他情况grabber.setImageWidth(600);grabber.setImageHeight(400);grabber.start();//开始获取摄像头数据int i = 1;for (; ; ) {Frame frame = grabber.grab();if (frame == null) {continue;}IplImage iplImage = converter.convert(frame);//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加if (iplImage != null) {// 一帧图片插入人脸图框faceProcessEngine.preview(iplImage);frame = converter.convert(iplImage);}// ======================================保存为图片(开始)============================================File imgFile = new File("想要保存的路径\\picture\\" + i + ".jpg");//判断保存的文件的文件夹是否存在,不存在创建。if (!imgFile.getParentFile().exists()) {System.out.println("保存文件的文件夹不存在,创建。");imgFile.getParentFile().mkdirs();}RenderedImage renderedImage = VideoProcessing.frameToBufferedImage(frame);ImageIO.write(renderedImage, "jpg", imgFile);// ======================================保存为图片(结束)============================================// 添加i++就是按照休眠时间保存图片,注释掉就只保存最后一帧图片,转换一下思路,假设休眠200ms, 那一秒保存五次图片,那么打开这张图片,过滤掉加载的白屏,就是5帧的视频
//            i++;if (outputStream.size() > 0) {byte[] bytes = outputStream.toByteArray();response.getOutputStream().write(bytes);outputStream.reset();}Thread.sleep(200);System.out.println("休眠200ms!!!");}}

2.2保存视频

public void servletStreamPlayer(HttpServletResponse response) throws Exception {//启动人脸处理引擎FacePreview faceProcessEngine = new FacePreview(appId, sdkKey);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);//新建opencv抓取器,一般的电脑和移动端设备中摄像头默认序号是0,不排除其他情况grabber.setImageWidth(600);grabber.setImageHeight(400);grabber.start();//开始获取摄像头数据// ======================================保存为视频(开始)============================================
// 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制) ?overrun_nonfatal=1&fifo_size=50000000//这里udp地址增加参数扩大udp缓存FFmpegFrameRecorder recorder = new FFmpegFrameRecorder("想要保存的路径\\picture\\" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".flv", grabber.getImageWidth(), grabber.getImageHeight(), 0);// 直播流格式// 转码recorder.setFormat("flv");recorder.setInterleaved(false);recorder.setVideoOption("tune", "zerolatency");recorder.setVideoOption("preset", "ultrafast");recorder.setVideoOption("crf", "26");recorder.setVideoOption("threads", "1");double frameRate = grabber.getFrameRate();recorder.setFrameRate(frameRate);// 设置帧率recorder.setGopSize(25);// 设置gop,关键帧int videoBitrate = grabber.getVideoBitrate();recorder.setVideoBitrate(videoBitrate);// 设置码率500kb/s,画质recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);recorder.setTrellis(1);recorder.setMaxDelay(0);// 设置延迟recorder.setAudioChannels(grabber.getAudioChannels());recorder.start();// ======================================保存为视频(开始)============================================long startTime = 0;long videoTS = 0;for (; ; ) {Frame frame = grabber.grab();if (frame == null) {continue;}IplImage iplImage = converter.convert(frame);//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加if (iplImage != null) {// 一帧图片插入人脸图框faceProcessEngine.preview(iplImage);frame = converter.convert(iplImage);}if (startTime == 0) {startTime = System.currentTimeMillis();}videoTS = 1000 * (System.currentTimeMillis() - startTime);
//             判断时间偏移if (videoTS > recorder.getTimestamp()) {recorder.setTimestamp((videoTS));}recorder.record(frame);if (outputStream.size() > 0) {byte[] bytes = outputStream.toByteArray();response.getOutputStream().write(bytes);outputStream.reset();}Thread.sleep(100);System.out.println("休眠100ms!!!");}}

2.3页面打开摄像头

首先介绍一下四个参数的作用

DO_NOTHING_ON_CLOSE,(在你点击关闭按钮的时候,不会被关闭,)不执行任何操作。
HIDE_ON_CLOSE,(当你点击关闭按钮的时候,不会释放内存,只是隐藏该界面,没有真正的关闭,还占有资源)只隐藏界面,setVisible(false)。
DISPOSE_ON_CLOSE,点击关闭按钮的时候,隐藏并释放窗体,dispose(),当最后一个窗口被释放后,则程序也随之运行结束。
EXIT_ON_CLOSE,直接关闭应用程序,System.exit(0)。一个main函数对应一整个程序。**

CanvasFrame canvas = new CanvasFrame(“摄像头预览”);//新建一个预览窗口
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

public void servletStreamPlayer(HttpServletResponse response) throws Exception {//启动人脸处理引擎FacePreview faceProcessEngine = new FacePreview(appId, sdkKey);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);//新建opencv抓取器,一般的电脑和移动端设备中摄像头默认序号是0,不排除其他情况grabber.setImageWidth(600);grabber.setImageHeight(400);grabber.start();//开始获取摄像头数据CanvasFrame canvas = new CanvasFrame("摄像头预览");//新建一个预览窗口canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);canvas.setVisible(true);canvas.setFocusable(true);// 窗口置顶if (canvas.isAlwaysOnTopSupported()) {canvas.setAlwaysOnTop(true);}for (; ; ) {Frame frame = grabber.grab();if (frame == null) {continue;}IplImage iplImage = converter.convert(frame);//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加if (iplImage != null) {// 一帧图片插入人脸图框faceProcessEngine.preview(iplImage);frame = converter.convert(iplImage);}// 获取摄像头图像并放到窗口上显示,frame是一帧图像canvas.showImage(frame);if (outputStream.size() > 0) {byte[] bytes = outputStream.toByteArray();response.getOutputStream().write(bytes);outputStream.reset();}Thread.sleep(100);System.out.println("休眠100ms!!!");}}

其中主要是这一步:把在2.1得到的每一帧图片按照设定的休眠时间放在打开的窗口上展示,展示出来的就是一个视频
// 获取摄像头图像并放到窗口上显示,frame是一帧图像
canvas.showImage(frame);

二、运行结果

总结

经历了CV的捶打,结果终于出来了,人脸识别成功之后下节做人脸识别登录。
本项目git地址:https://gitee.com/table-tennis-king/faceForCamera.git

【javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码)】相关推荐

  1. 以canvas为动态网页背景,添加的标签内容不显示(附源码-----动态背景星空)

    问题描述: 我在网上下载了一个动态网页背景--星空,然后本地能运行,但是当我添加其他组件的时候,发现组件不显示,然后只能显示动态背景.仔细看了一下代码,发现这个动态背景是依靠canvas标签来实现的. ...

  2. 基于SSM的家庭理财管理系统,高质量毕业论文范例-可直接参考使用,附源码和数据库脚本,论文撰写视频教程

    目录 1.项目技术栈 2.适合对象 3.适合课题 4.项目功能概述 4.1功能列表 4.2 功能详情 5.高质量论文范例 6. 毕业设计撰写视频教程 7. 部分运行截图 1.项目技术栈 前端必学三个基 ...

  3. 【013】基于Vue的酒店客房管理系统(含管理员、普通用户两种身份(附源码数据库、课设报告)

    这里写目录标题 一.系统详细介绍 二.系统部分设计思路 三.项目获取 一.系统详细介绍 前言: 这次带来的是基于Nodejs+Vue+Mysql的酒店客房管理系统,含非常非常详细的课设报告,觉得物超所 ...

  4. 基于SpringBoot的医院门诊管理系统,高质量毕业论文范例-可直接参考使用,附源码和数据库脚本,项目导入运行视频教程,论文撰写教程

    1.项目技术栈 前端必学三个基础HTML.CSS.JS,基本每个B/S架构项目都要用到,基础中的基础.此外项目页面使用thymeleaf等前端框架技术. 后端使用Java主流的框架SpringBoot ...

  5. 基于SSM的在线视频教育网站系统【附源码】

    项目概述 基于SSM的在线视频教育网站系统设计与实现.系统分为管理员与普通用户两种角色.非maven项目. 1)登录模块 在进入系统首页后,首先看到的是登录界面,该界面会提供注册用户的功能,在登陆界面 ...

  6. 基于Node.js+Express+MySQL的爱心助农电商管理系统的设计与实现(附源码)

    摘要 2020年新型冠状病毒突如其来,在疫情的影响下,全国各个地区的农产品销售均不同程度的出现了需求信息不畅,农产品管理困难,订单物流模糊,农产品滞销等问题的出现.与此同时2020年也是我国全面小康, ...

  7. ssm基于微信小程序的社区老人健康管理服务系统的设计与实现 毕业设计-附源码011513

    摘要 随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多分类管理之中,他们利用网络来做这个社区老人健康管理服务系统,随之就产生了"社区老人健康管理服务系统 .",这 ...

  8. Python 基于微博舆情分析系统的设计与实现,GUI可视化界面(毕业设计,附源码,教程)

    文章目录 1. 简介 2. 技术选型 3. 实现功能简介 **第4章系统总体设计** 5. 系统选型 1. 简介 微博舆情分析系统软件是一款方便,快捷,实用的信息服务查询软件.随着智能手机在全球市场的 ...

  9. java人脸识别教程_用 Java 实现人脸识别功能(附源码)

    > 整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 引言 远程在家办公的第N天,快要闲出屁了,今 ...

最新文章

  1. 机器学习实战(十)利用K-means算法对未标注数据分组
  2. Java代码性能优化常用方法
  3. Know more about Enqueue Deadlock Detection
  4. 谈一谈不常见却又不可少的ThreadLocal
  5. 考研英语一和英语二的区别
  6. CPU虚拟化技术解析
  7. MySQL源码调试入门
  8. java栈和队列的区别是什么意思_java中栈和队列的区别是什么?
  9. 微信小程序周记(第一周 7.19-7.25)
  10. 22种手机使用中的常见问题及处理方法
  11. java8 Stream分组求和 reducing
  12. Dropout 和 keep_prob
  13. pt-table-checksum 使用实践
  14. 默默学Sharding-Sphere(一)
  15. Linux下串口调试及使用shell编程接收数据
  16. VTK-医学三维图像四视图显示以及鼠标滑轮控制切片交互
  17. vbs和java有关系吗_Java程序员所需的批处理和VBS脚本 (转载)
  18. 物联网控制技术作业----信号流图---梅森公式
  19. 信息学竞赛OI 常用OJ
  20. EDA01--Linux简介与基本指令入门

热门文章

  1. Flutter的setState的使用注意事项以及报错The method ‘setState‘ isn‘t defined for the type
  2. Unity优化之音频
  3. 【Ubuntu】虚拟机忘记登录密码如何解决
  4. Es6扩展运算符(...)的使用
  5. 光模块之数通市场代际更迭,100G需求恢复,400G蓄势待发
  6. 「网络设备模拟器」EVE-NG安装操作指导
  7. 在linux中 如果想查看连接磁盘的情况,在Linux系统下安装和使用Duc的方法
  8. python利用jpype调用java对象方法
  9. 计算机网络复习总结:什么是OSI7层模型、5层模型、TCP/IP 4层模型,各层协议导航
  10. 微信小程序+云开发实现课程表查询