java调摄像头和人脸比对

我需要做一个功能,就是网站页面调用摄像头截图。现在由于要用java,就得研究用java怎么调用摄像头。顺带玩了一下人脸比对,资料有点少。

效果
在这里插入图片描述

采用javacv实现,先加Maven引用,后面把下载的包再独立引用不用Maven了
在这里插入图片描述

实现代码

package javacv;import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.nio.IntBuffer;
import java.util.ArrayList;
import java.util.List;import org.bytedeco.javacv.*;
import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.indexer.*;
import org.bytedeco.opencv.opencv_core.*;
import org.bytedeco.opencv.opencv_face.LBPHFaceRecognizer;
import org.bytedeco.opencv.opencv_imgproc.*;
import org.bytedeco.opencv.opencv_calib3d.*;
import org.bytedeco.opencv.opencv_objdetect.*;
import org.opencv.core.Core;
import org.opencv.core.MatOfInt;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;import javax.imageio.ImageIO;
import javax.swing.*;import static org.bytedeco.opencv.global.opencv_core.*;
import static org.bytedeco.opencv.global.opencv_imgproc.*;
import static org.bytedeco.opencv.global.opencv_calib3d.*;
import static org.bytedeco.opencv.global.opencv_objdetect.*;/*** 用来试验调用摄像头*/
public class Demo {//使用LBPHFaceRecognizer进行人脸识别static LBPHFaceRecognizer recognizer =null;/*** 测试摄像头操作** @param args* @throws Exception*/public static void main(String[] args) throws Exception {//用摄像头抓图//ShowCamera();//人脸识别URL url = Demo.class.getResource("/default.xml");faceDetection(url.getFile().substring(1), 1920, 1080);}/*** 调用摄像头抓图** @throws Exception*/public static void ShowCamera() throws Exception {//新建opencv抓取器,一般的电脑和移动端设备中摄像头默认序号是0,不排除其他情况FrameGrabber grabber1 = FrameGrabber.createDefault(0);//设置分辨率grabber1.setImageWidth(1920);grabber1.setImageHeight(1080);//设置帧率grabber1.setFrameRate(80);//开始获取摄像头数据grabber1.start();//新建一个预览窗口CanvasFrame canvas = new CanvasFrame("摄像头预览");canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//用死循环监控摄像头,窗口是否关闭while (canvas.isDisplayable()) {Frame frame = grabber1.grab();/*获取摄像头图像并在窗口中显示,这里Frame frame=grabber.grab()得到是解码后的视频图像*/canvas.showImage(grabber1.grab());//可以保存图片/*Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage image = converter.convert(frame);//设置文件名String fileName = "capture.jpg";// 保存图片到文件ImageIO.write(image, "jpg", new File(fileName));*/}//停止抓取grabber1.close();}/*** JavaCV人脸检测** @param cascadeClassifierXml 基于Haar特征的cascade正面人脸分类器* @param width                图像宽度* @param height               图像高度* @author eguid*/public static void faceDetection(String cascadeClassifierXml, Integer width, Integer height) throws Exception, InterruptedException {//开启摄像头,获取图像(得到的图像为frame类型,需要转换为mat类型进行检测和识别)OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);if (width != null && width > 1 && height != null && height > 1) {grabber.setImageWidth(width);grabber.setImageHeight(height);}grabber.start();if (width == null || height == null) {height = grabber.getImageHeight();width = grabber.getImageWidth();}//新建一个预览窗口CanvasFrame canvas = new CanvasFrame("人脸检测");canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);canvas.setVisible(true);canvas.setFocusable(true);//窗口置顶canvas.setAlwaysOnTop(true);Frame frame = null;//读取opencv人脸检测器CascadeClassifier cascade = new CascadeClassifier(cascadeClassifierXml);for (; canvas.isVisible() && (frame = grabber.grab()) != null; ) {//从frame中直接获取MatMat img = (Mat) frame.opaque;//存放灰度图Mat grayImg = new Mat();//摄像头色彩模式设置成ImageMode.Gray下不需要再做灰度//摄像头获取的是彩色图像,所以先灰度化下cvtColor(img, grayImg, COLOR_BGRA2GRAY);//如果要获取摄像头灰度图,可以直接对FrameGrabber进行设置grabber.setImageMode(ImageMode.GRAY);,grabber.grab()获取的都是灰度图//均衡化直方图equalizeHist(grayImg, grayImg);// 检测到的人脸RectVector faces = new RectVector();cascade.detectMultiScale(grayImg, faces);//遍历人脸for (int i = 0; i < faces.size(); i++) {Rect face_i = faces.get(i);//绘制人脸矩形区域,scalar色彩顺序:BGR(蓝绿红)rectangle(img, face_i, new Scalar(0, 255, 0, 1));int pos_x = Math.max(face_i.tl().x() - 10, 0);int pos_y = Math.max(face_i.tl().y() - 10, 0);//在人脸矩形上方绘制提示文字putText(img, "*", new Point(pos_x, pos_y), FONT_HERSHEY_COMPLEX, 1.0, new Scalar(0, 0, 255, 2.0));}//比较人脸相似度FaceCompare(grayImg);//获取摄像头图像并放到窗口上显示,frame是一帧视频图像canvas.showImage(frame);//40毫秒刷新一次图像Thread.sleep(40);}cascade.close();canvas.dispose();//停止抓取grabber.close();}/*** 比较人脸相似度** @param faceImage2*/private static void FaceCompare(Mat faceImage2) {if(recognizer==null) {//加载dllURL urldll = Demo.class.getResource("/opencv_java440.dll");System.load(urldll.getFile().substring(1));OpenCVFrameConverter.ToMat converter1 = new OpenCVFrameConverter.ToMat();//OpenCVFrameConverter.ToOrgOpenCvCoreMat converter2 = new OpenCVFrameConverter.ToOrgOpenCvCoreMat();//加载作者头像URL urlzlz = Demo.class.getResource("/zhanglianzhu.png");org.opencv.core.Mat faceImage1Old = Imgcodecs.imread(urlzlz.getFile().substring(1));//读取两张人脸图片Mat faceImage1 = converter1.convert(converter1.convert(faceImage1Old));//转换图片为灰度图,因为大部分人脸识别算法都在灰度图上运行org.opencv.core.Mat grayFace1 = new org.opencv.core.Mat();Imgproc.cvtColor(faceImage1Old, grayFace1, Imgproc.COLOR_BGR2GRAY);//使用LBPHFaceRecognizer进行人脸识别recognizer = LBPHFaceRecognizer.create();//设置阈值recognizer.setThreshold(100);//图片向量MatVector vec = new MatVector();vec.put(converter1.convert(converter1.convert(grayFace1)));int[] labels = {0};MatOfInt labelVector = new MatOfInt(labels);//训练识别器,这里我们使用同一张脸的图片进行训练和预测,实际中应使用不同的人脸图片进行训练recognizer.train(vec, converter1.convert(converter1.convert(labelVector)));}//预测第二张图片的人脸IDIntBuffer label = IntBuffer.allocate(1);int[] label1 = new int[1];double[] confidence = new double[1];recognizer.predict(faceImage2, label1, confidence);System.out.println("置信度:" + confidence[0]);//输出结果if (confidence[0] < 25) {System.out.println("检测到张联珠");} else {System.out.println("摄像头前面不是张联珠");}}
}

这就是java调摄像头的试验,后面给JRTClient加上调摄像头截图支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479747.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用安卓平板远程Ubuntu服务器通过VS Code远程开发

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;…

Linux搭建JavaEE环境

Linux搭建JavaEE环境 需要在 Linux 下进行 JavaEE 的开发&#xff0c;我们需要安装如下软件 JDKtomcatmysqlidea 安装JDK 安装步骤 首先去官网下载jdk的linux版本 下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 1) mkdir /opt/jdk 2) 通过 …

【postgresql】ERROR: relation “data_screen.import_record_id_seq“ does not exist

创建表时候提示下面错误&#xff1a; ERROR: relation "data_screen.import_record_id_seq" does not exist 错误&#xff1a;关系“data_screen.import_record_id_seq”不存在 创建语句 CREATE TABLE "data_screen"."import_record" ("…

SpringBoot+Vue+MySQL:图书管理系统的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Laravel Reverb 强势降临:全新风潮,引领未来开发潮流!

终于有官方 Websocket package 了&#xff01;&#xff01;&#xff01; Laravel Reverb &#xff01;&#xff01;&#xff01; reverb.laravel.com/ Laravel Reverb的引入使得Laravel框架在实时通信方面更加强大和灵活&#xff0c;为开发者提供了更多的选择和可能性。通过利…

http前生今世

HTTP/0.9&#xff0c;仅支持GET方法&#xff0c;并且响应中没有HTTP头信息&#xff0c;只有文档内容。 HTTP/1.0增加了对POST方法、状态码、HTTP头信息等的支持&#xff0c;这一版本也是广泛应用的历史性版本。 HTTP/1.1引入了持久连接&#xff08;Persistent Connections&…

【.NET Core】常见C#代码约定

【.NET Core】常见C#代码约定 文章目录 【.NET Core】常见C#代码约定一、概述二、代码预定的目标三、代码约束工具和分析器四、C#语言准则五、字符串约定5.1 使用字符串内插来连接短字符串5.2 插入大文本时&#xff0c;使用System.Text.StringBuilder对象 六、数组约定七、委托…

书生开源大模型训练营-第3讲笔记

5.Langchain和InternLM搭建知识库 5.1环境 还是一样&#xff0c;开发机中创建镜像&#xff0c;以及所需依赖 pip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0.1.99 pip install accelerate0.24.15.2模…

算法面试八股文『 模型详解篇 』

说在前面 这是本系列的第二篇博客&#xff0c;主要是整理了一些经典模型的原理和结构&#xff0c;面试有时候也会问到这些模型的细节&#xff0c;因此都是需要十分熟悉的。光看原理还不够&#xff0c;最好是能用代码试着复现&#xff0c;可以看看李沐老师深度学习的教材&#…

信钰证券|lpr下降对股市的影响?是利好还是利空?

lpr是借款市场报价利率&#xff0c;它的上调、下降对股市会发生一定的影响&#xff0c;那么&#xff0c;lpr下降对股市的影响&#xff1f;是利好仍是利空&#xff1f; lpr下降对股市是利好&#xff0c;因为&#xff0c;lpr下降意味着借款本钱削减&#xff0c;会推进实体经济的…

Java使用百度地图API根据经纬度反查位置信息

前言 一个小需求&#xff0c;需要查询某车某手机的位置信息&#xff0c;可以使用百度或者高德提供的地图API,本文以百度地图API为例。 获取ak 这是第一步&#xff0c;我们登录百度地图&#xff0c;创建应用获取ak API接口地址 https://api.map.baidu.com/reverse_geocoding/v3/…

物联网水域信息化:水质监测智慧云平台

行业背景 由于传统水务企业水质监测和管理技术不足&#xff0c;以及水源污染等问题&#xff0c;确保供水水质达标困难重重。 且传统水务行业信息化手段单一&#xff0c;缺乏对大数据等新技术的应用&#xff0c;一定程度上影响了水务工作的精细化和智能化程度。 系统特点 为…