千家信息网

Java中怎么使用opencv开发人脸识别功能

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,今天小编给大家分享一下Java中怎么使用opencv开发人脸识别功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收
千家信息网最后更新 2026年11月03日Java中怎么使用opencv开发人脸识别功能

今天小编给大家分享一下Java中怎么使用opencv开发人脸识别功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

背景:最近需要用到人脸识别,但又不花钱使用现有的第三方人脸识别接口,为此使用opencv结合java进行人脸识别(ps:opencv是开源的,使用它来做人脸识别存在一定的误差,效果一般)。

1.安装opencv

如果是官网下载,就无脑安装就行了,安装完毕后。

2.在项目中引入pom依赖

                    org.bytedeco.javacpp-presets            ffmpeg            4.1-1.4.4                            org.bytedeco            javacv            1.4.4                                    org.bytedeco.javacpp-presets            ffmpeg-platform            4.1-1.4.4                                            org.bytedeco            javacv-platform            1.4.4                                    org.bytedeco.javacpp-presets            opencv-platform            4.0.1-1.4.4        

1.导入库依赖
File --> Project Structure,点击Modules,选择需要使用opencv.jar的项目。

选择直接opencv安装路径

2.java代码demo

package org.Litluecat.utils;import org.apache.commons.lang.StringUtils;import org.opencv.core.*;import org.opencv.highgui.HighGui;import org.opencv.highgui.ImageWindow;import org.opencv.imgcodecs.Imgcodecs;import org.opencv.imgproc.Imgproc;import org.opencv.objdetect.CascadeClassifier;import org.opencv.videoio.VideoCapture;import org.opencv.videoio.VideoWriter;import org.opencv.videoio.Videoio;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Arrays;/** * 人脸比对工具类 * @author Litluecat * @Title: Opencv 图片人脸识别、实时摄像头人脸识别**/public class FaceVideo {    private static final Logger log = LoggerFactory.getLogger(FaceVideo.class);    private static final String endImgUrl = "C:\Users\lenovo\Desktop\";    /**     * opencv的人脸识别xml文件路径     */    private static final String faceDetectorXML2URL = "D:\Sofeware\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml";    /**     * opencv的人眼识别xml文件路径     */    private static final String eyeDetectorXML2URL = "D:\Sofeware\opencv\sources\data\haarcascades\haarcascade_eye.xml";    /**     * 直方图大小,越大精度越高,运行越慢     */    private static int Matching_Accuracy = 100000;    /**     * 初始化人脸探测器     */    private static CascadeClassifier faceDetector;    /**     * 初始化人眼探测器     */    private static CascadeClassifier eyeDetector;    private static int i=0;    static {        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);        faceDetector = new CascadeClassifier(faceDetectorXML2URL);        eyeDetector = new CascadeClassifier(eyeDetectorXML2URL);    }    public static void main(String[] args) {        log.info("开始人脸匹配");        long begin = System.currentTimeMillis();        // 1- 从摄像头实时人脸识别,识别成功保存图片到本地        try{            getVideoFromCamera(endImgUrl + "2.jpg");            //仅用于强制抛异常,从而关闭GUI界面            Thread.sleep(1000);            int err = 1/0;                 // 2- 比对本地2张图的人脸相似度 (越接近1越相似)//            double compareHist = FaceVideo.compare_image(endImgUrl + "test1.jpg" , endImgUrl + "face.jpg");//            log.info("匹配度:{}",compareHist);//            if (compareHist > 0.72) {//                log.info("人脸匹配");//            } else {//                log.info("人脸不匹配");//            }        }catch (Exception e){            log.info("开始强制关闭");            log.info("人脸匹配结束,总耗时:{}ms",(System.currentTimeMillis()-begin));            System.exit(0);        }    }    /**     * OpenCV-4.1.1 从摄像头实时读取     * @param targetImgUrl 比对身份证图片     * @return: void     * @date: 2019年8月19日 17:20:13     */    public static void getVideoFromCamera(String targetImgUrl) {        //1 如果要从摄像头获取视频 则要在 VideoCapture 的构造方法写 0        VideoCapture capture = new VideoCapture(0);        Mat video = new Mat();        int index = 0;        if (capture.isOpened()) {            while(i<3) {                // 匹配成功3次退出                capture.read(video);                HighGui.imshow("实时人脸识别", getFace(video, targetImgUrl));                //窗口延迟等待100ms,返回退出按键                index = HighGui.waitKey(100);                //当退出按键为Esc时,退出窗口                if (index == 27) {                    break;                }            }        }else{            log.info("摄像头未开启");        }        //该窗口销毁不生效,该方法存在问题        HighGui.destroyAllWindows();        capture.release();        return;    }    /**     * OpenCV-4.1.0 人脸识别     * @param image 待处理Mat图片(视频中的某一帧)     * @param targetImgUrl 匹配身份证照片地址     * @return 处理后的图片     */    public static Mat getFace(Mat image, String targetImgUrl) {        MatOfRect face = new MatOfRect();        faceDetector.detectMultiScale(image, face);        Rect[] rects=face.toArray();        log.info("匹配到 "+rects.length+" 个人脸");        if(rects != null && rects.length >= 1) {            i++;            if(i==3) {                // 获取匹配成功第3次的照片                Imgcodecs.imwrite(endImgUrl + "face.jpg", image);                FaceVideoThread faceVideoThread = new FaceVideoThread(targetImgUrl , endImgUrl + "face.jpg");                new Thread(faceVideoThread,"人脸比对线程").start();            }        }        return image;    }    /**     * 人脸截图     * @param img     * @return     */    public static String face2Img(String img) {        String faceImg = null;        Mat image0 = Imgcodecs.imread(img);        Mat image1 = new Mat();        // 灰度化        Imgproc.cvtColor(image0, image1, Imgproc.COLOR_BGR2GRAY);        // 探测人脸        MatOfRect faceDetections = new MatOfRect();        faceDetector.detectMultiScale(image1, faceDetections);        // rect中人脸图片的范围        for (Rect rect : faceDetections.toArray()) {            faceImg = img+"_.jpg";            // 进行图片裁剪            imageCut(img, faceImg, rect.x, rect.y, rect.width, rect.height);        }        if(null == faceImg){            log.info("face2Img未识别出该图像中的人脸,img={}",img);        }        return faceImg;    }    /**     * 人脸比对     * @param img_1     * @param img_2     * @return     */    public static double compare_image(String img_1, String img_2) {        Mat mat_1 = conv_Mat(img_1);        Mat mat_2 = conv_Mat(img_2);        Mat hist_1 = new Mat();        Mat hist_2 = new Mat();        //颜色范围        MatOfFloat ranges = new MatOfFloat(0f, 256f);        //直方图大小, 越大匹配越精确 (越慢)        MatOfInt histSize = new MatOfInt(Matching_Accuracy);        Imgproc.calcHist(Arrays.asList(mat_1), new MatOfInt(0), new Mat(), hist_1, histSize, ranges);        Imgproc.calcHist(Arrays.asList(mat_2), new MatOfInt(0), new Mat(), hist_2, histSize, ranges);        // CORREL 相关系数        double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL);        return res;    }    /**     * 灰度化人脸     * @param img     * @return     */    public static Mat conv_Mat(String img) {        if(StringUtils.isBlank(img)){            return null;        }        Mat image0 = Imgcodecs.imread(img);        Mat image1 = new Mat();        //Mat image2 = new Mat();        // 灰度化        Imgproc.cvtColor(image0, image1, Imgproc.COLOR_BGR2GRAY);        //直方均匀        //Imgproc.equalizeHist(image1, image2);        // 探测人脸        MatOfRect faceDetections = new MatOfRect();        faceDetector.detectMultiScale(image1, faceDetections);        //探测人眼//        MatOfRect eyeDetections = new MatOfRect();//        eyeDetector.detectMultiScale(image1, eyeDetections);        // rect中人脸图片的范围        Mat face = null;        for (Rect rect : faceDetections.toArray()) {            //给图片上画框框 参数1是图片 参数2是矩形 参数3是颜色 参数四是画出来的线条大小            //Imgproc.rectangle(image0,rect,new Scalar(0,0,255),2);            //输出图片            //Imgcodecs.imwrite(img+"_.jpg",image0);            face = new Mat(image1, rect);        }        if(null == face){            log.info("conv_Mat未识别出该图像中的人脸,img={}",img);        }        return face;    }}

这边的人脸识别是另外其线程进行比对,代码如下。

package org.Litluecat.utils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class FaceVideoThread implements Runnable{    private static final Logger log = LoggerFactory.getLogger(FaceVideoThread.class);    private String oneImgUrl = null;    private String otherImgUrl = null;    public FaceVideoThread(String oneImgUrl, String otherImgUrl){        this.oneImgUrl = oneImgUrl;        this.otherImgUrl = otherImgUrl;    }    @Override    public void run() {        try {            double compareHist = FaceVideo.compare_image(oneImgUrl , otherImgUrl);            log.info("匹配度:{}",compareHist);            if (compareHist > 0.72) {                log.info("人脸匹配");            } else {                log.info("人脸不匹配");            }        } catch (Exception e) {            e.printStackTrace();        }    }}

提醒:如果运行异常,请添加你opencv的安装地址-Djava.library.path=D:Sofewareopencvuildjavax64;

以上就是"Java中怎么使用opencv开发人脸识别功能"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

人脸 图片 探测 参数 摄像头 知识 篇文章 摄像 人眼 大小 实时 灰度 范围 路径 功能 开发 相似 成功 代码 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技 中智农互联网科技 广州万易互联网科技有限公司 上海卓越科技互联网 互联网与科技金融数据 华宇互联网科技 平安科技 互联网 亿策互联网科技 互联网科技公司有哪些 天速互联网络科技有限公司 移动互联网科技股 青岛科技大学互联网大赛研究生 呼和浩特新华互联网科技学院 中国互联网公司排名锤子科技 晋城互联网科技 工业互联网等科技实现智能化赋能 2021互联网科技公司排名 互联网科技包装股 全球科技与互联网公司市值变化 现代科技的标志之一的互联网 深圳市人人互联网科技有限公司 狮子座互联网科技有限公司 哈尔滨秒房互联网科技有限公司 科技赋能互联网健康 温州喔噻互联网科技有限公司 深圳育鹏互联网科技有限公司招聘 徐州市互联网科技有限公司 华中科技大学互联网的牛人 美国五大互联网科技公司市值多少 互联网科技企业文化
0