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中直接获取Mat
            Mat 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) {
            //加载dll
            URL 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)));
        }
        //预测第二张图片的人脸ID
        IntBuffer 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加上调摄像头截图支持

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UI自动化测试篇 :webdriver+ant+jenkins自动化测试实践

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

OpenCV笔记2:鼠标事件实现绘制直线、矩阵、曲线

OpenCV 鼠标事件 创建窗口设置窗口大小鼠标事件监听 判断事件更新起始点和终点绘制线显示图片 打开背景图 """ 鼠标事件 down up move """ import cv2 import numpy as npWINNAME DRAWBOARD st_point (-1, -1) end_point (-1, -1)def draw…

【Unity】管道流动模拟Shader

【Unity】管道流动模拟Shader 抽象模拟管道介质流动的效果&#xff0c;使用顶点片元着色器。可以调整管线光泽&#xff0c;颜色&#xff0c;流动方向&#xff0c;透明度&#xff0c;流动体粗细&#xff0c;流动速度和横断面。 实现效果 Demo效果 Demo下载地址 管线光泽调整 …

proteus8.15图文安装教程

proteus8.15版本可以用STM32系列单片机来进行仿真设计&#xff0c;比7.8版本方便多了&#xff0c;有需要的朋友们可以在公众号后台回复 proteus8.15 获取软件包。 1、下载好软件包&#xff0c;解压如下&#xff0c;右键proteus8.15.sp1以管理员身份运行。 2、第一次安装&#x…

【蓝桥杯单片机入门记录】独立按键

目录 一、键盘、微动开关概述 二、按键工作原理 &#xff08;1&#xff09;按键构成 &#xff08;2&#xff09;&#xff08;蓝桥杯开发板&#xff09;独立按键电路图&#xff08;非实际&#xff0c;参考理解&#xff09; &#xff08;3&#xff09;独立按键工作原理 三、…

【J1939】一、概述,协议基础

文章目录 1. 背景2. 要点3. J1939帧细节3.1 协议数据单元(Protocol Data Unit,PDU)3.2 参数组编号(PGN)3.3 可疑参数编号(Suspect Parameter Number,SPN)参考1. 背景 J1939是一种用于商用车辆的通信协议,它定义了一套车辆电子控制单元之间进行数据通信的规范。J1939协议…

OpenAI 发布文生视频模型 Sora,普通人应该怎么做才能利益最大化?

原文链接&#xff1a; OpenAI 发布文生视频模型 Sora&#xff0c;普通人应该怎么做才能利益最大化&#xff1f; 自从 2022 年 11 月 30 日 ChatGPT 发布之后&#xff0c;每次 OpenAI 再发布新功能都跟过年一样&#xff0c;那叫一个热闹。 包括 GPT 4.0&#xff0c;GPT Store&…

滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

2024年单服务器部署Mongodb三节点副本集自动化部署脚本

该脚本是为了方便自己学习和工作中部署服务器从而节省时间进行编写&#xff0c;目前能正常部署&#xff0c;创建集群&#xff0c;管理员用户&#xff0c;以及连接都没问题&#xff0c;但是没有开启验证&#xff0c;后续找时间补充。 完整的教程请参考一下我写的技术文章。 20…

十六进制数

1.做一个收电费程序&#xff0c;要求输入使用的电的度数&#xff08;整数&#xff09;以及电费单价&#xff08;实数&#xff09;&#xff0c;输出总的用电费用。 2.提示并输入一个小写字母数据&#xff0c;输出其对应的ASCII值&#xff0c;以及该小写字母对应的大写字母。 3.提…

软件测试工程师linux学习之系统层面相关命令总结

1 linux系统重启和关机的命令 重启命令&#xff1a;reboot 关机命令&#xff1a;shutdown 这两个命令一般很少用到&#xff0c;我们了解即可。 2 查看日志信息命令 什么是日志&#xff0c;日志就是一个一个普通的文本文件&#xff0c;文件里面记录的是软件运行过程中的信息…

市场复盘总结 20240221

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 33% 最常用…

搜维尔科技:用于运动科学的 OptiTrack,范围标记、步态捕捉!

OptiTrack 系统提供世界领先的测量精度和简单易用的工作流程&#xff0c;为研究人员和生物力学师的研究提供理想的 3D 跟踪数据。 对所有主要数字测力台、EMG 和模拟设备的本机即插即用支持为研究人员提供了在 Visual3D、MotionMonitor、MATLAB 和其他第三方生物力学软件包中进…

MySQL数据库基础(十二):子查询(三步走)

文章目录 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 二、子查询的使用 三、总结 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 在一个 select 语句中,嵌入了另外一个 select …

如何使用Coded UI Test对Webpage进行自动化测试

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

2024 年了,如何 0 基础开始学习 Vue ?

最近 5 个月&#xff0c;我都在忙着构建我的第一开源项目 HexoPress&#xff0c;这个项目是使用 Electron Vue 3 TypeScript 等技术实现的&#xff0c;一方面&#xff0c;我真的很需要一款合自己心意的博客编辑器&#xff0c;另一方面&#xff0c;我也是真心想学习 Electron …

App Inventor 2 Activity启动器技巧:如何查看并启动其他App

App包名和类名的查看 由 App Inventor 2 创建的应用要弄清包名和类名&#xff0c;可通过下载其应用程序的源代码&#xff0c;然后使用文件资源管理器或解压缩程序解压 .aia源文件&#xff08;文件的扩展名修改成.zip 或.rar&#xff0c;然后解压&#xff09;&#xff0c;在解压…

Redis面试题及核心知识点讲解

redis是单线程还是多线程&#xff1f; redis是单线程的&#xff0c;主要是指网络I/O线程。Redis的持久化&#xff0c;集群同步等操作&#xff0c;则由另外的线程来执行。 2 . redis是单线程&#xff0c;为什么处理这么快&#xff1f; Redis的大部分操作都是在内存中完成。单线…

电脑进水无法开机怎么办 电脑进水开不了机的解决方法

意外总是会不定时打破你的计划&#xff0c;电脑这类电器最怕遇到的除了火还有水&#xff0c;设备进水会导致数据丢失&#xff0c;那么我们遇到电脑进水怎么办&#xff1f;进水之后不正确处理也会引起很多不必要的麻烦. 解决办法 第一步&#xff1a;关机 如果您的电脑是在开…

山西电力市场日前价格预测【2024-02-22】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-22&#xff09;山西电力市场全天平均日前电价为441.87元/MWh。其中&#xff0c;最高日前电价为680.73元/MWh&#xff0c;预计出现在18:45。最低日前电价为352.02元/MWh&#xff0c;预计…