• Java中利用OpenCV进行人脸识别


    OpenCV
    概述

    ​ OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,它提供了丰富的工具和算法,用于处理图像和视频数据。该库由一系列高效的计算机视觉算法组成,涵盖了许多领域,包括目标识别、图像处理、机器学习、三维重建等。

    以下是OpenCV的一些关键特点和功能:

    1. 跨平台性: OpenCV是一个跨平台的计算机视觉库,支持Windows、Linux、macOS、iOS等多个操作系统。
    2. 图像处理: OpenCV提供了丰富的图像处理功能,包括图像滤波、边缘检测、形态学操作、颜色空间转换等。
    3. 特征检测与描述符: OpenCV包括多种特征检测和描述符算法,如SIFT、SURF、ORB等,用于在图像中寻找关键点并生成描述符。
    4. 目标检测: OpenCV支持多种目标检测算法,其中包括Haar级联分类器、HOG(Histogram of Oriented Gradients)等。
    5. 图像分割: OpenCV包括图像分割算法,用于将图像分成不同的区域或对象。
    6. 计算机视觉: OpenCV涉及计算机视觉的多个领域,如立体视觉、相机标定、运动估计等。
    7. 机器学习: OpenCV集成了一些机器学习算法,包括支持向量机、k近邻、决策树等。
    8. 深度学习: OpenCV对深度学习模型的支持不断增强,包括对常见深度学习框架(如TensorFlow、PyTorch)模型的集成。
    9. 多媒体处理: OpenCV支持对视频流和音频数据的处理,包括捕捉、录制、播放等。
    10. 开源和社区: OpenCV是一个开源项目,拥有庞大的用户社区。这意味着你可以从社区获取支持,分享代码和经验。

    使用OpenCV可以在计算机视觉和图像处理项目中加速开发过程。无论是学术研究还是商业应用,OpenCV都提供了丰富的工具和资源,帮助开发者处理图像和视频数据。

    其他学习方式:

    官网文档地址:https://docs.opencv.org/4.6.0/df/d65/tutorial_table_of_content_introduction.html

    教程参考:https://www.w3cschool.cn/opencv/

    教程参考:https://www.yiibai.com/opencv/opencv_adding_text.html

    下载与安装

    1、你可以从OpenCV的GitHub仓库下载Haar级联分类器的XML文件,该文件用于人脸检测。以下是官方的GitHub仓库地址:

    https://github.com/opencv/opencv

    在该仓库中,Haar级联分类器的XML文件通常位于 data/haarcascades 目录下。具体来说,用于人脸检测的文件是 haarcascade_frontalface_default.xml

    你可以通过直接访问GitHub页面下载该文件,或者使用Git工具将整个仓库克隆到本地。以下是通过Git克隆仓库的命令:

    git clone https://github.com/opencv/opencv.git
    
    • 1

    然后,你可以在 opencv/data/haarcascades 目录下找到 haarcascade_frontalface_default.xml 文件。

    请注意,OpenCV的GitHub仓库可能会有更新,因此你可能需要查看最新的版本。
    在这里插入图片描述

    2、下载地址:https://opencv.org/releases/

    在这里插入图片描述

    下载到本地后,双击进行安装即可

    在这里插入图片描述

    目录说明

    1、安装目录如下:

    在这里插入图片描述

    build :基于window构建

    sources:开源,提供源码

    2、这里是Java开发关注java目录即可:

    在这里插入图片描述

    x64与x86:代表给不同的系统使用

    opencv-452.jar:给java操作openvc的程序包

    3、由于是64位系统,所以关注x64目录:
    在这里插入图片描述

    DLL:(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。DLL文件,放置于系统中。当执行某一个程序时,相应的DLL文件就会被调用

    实现操作集成依赖
    方式一:

    ​ 这里使用IDEA进行开发,导入opencv-460.jar库,使用快捷键 Ctrl+Shift+Alt+S打开,选择库项,导入Java库:

    在这里插入图片描述

    方式二:

    ​ 创建一个maven项目(springboot也行),并引入依赖,在pom.xml文件中添加:

    
    <dependency>
        <groupId>org.openpnpgroupId>
        <artifactId>opencvartifactId>
        <version>4.5.1-1version> 
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    Java代码示例
    方式一:

    ​ 以下是一个简单的Java代码示例,演示如何使用OpenCV进行人脸识别。这个示例使用了OpenCV的Haar级联分类器来检测图像中的人脸。确保你已经将OpenCV的JAR文件添加到你的Java项目中。

    import nu.pattern.OpenCV;
    import org.opencv.core.*;
    import org.opencv.highgui.HighGui;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    import org.opencv.objdetect.CascadeClassifier;
    
    /**
     * 描述:Java中利用OpenCV进行人脸识别
     *
     * @author 为一道彩虹
     */
    public class FaceRecognition
    {
        public static void main(String[] args)
        {
            // 加载 OpenCV 库
            OpenCV.loadShared();
    
            // 读取图像
            String imagePath = "D://Test/1553247564696949.jpg";
            Mat image = Imgcodecs.imread(imagePath);
    
            // 加载人脸分类器
            String xmlFile = "D://haarcascade_frontalface_alt.xml";
            CascadeClassifier faceDetector = new CascadeClassifier(xmlFile);
    
            // 人脸检测
            MatOfRect faceDetections = new MatOfRect();
            faceDetector.detectMultiScale(image, faceDetections);
    
            // 绘制人脸框
            for (Rect rect : faceDetections.toArray())
            {
                Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
            }
    
            // 显示结果
            HighGui.imshow("Detected Face", image);
            HighGui.waitKey();
    
            // 释放资源
            image.release();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    确保替换 imagePathxmlFile 为你实际的图像文件路径和Haar级联分类器的XML文件路径。

    原图:

    在这里插入图片描述

    利用 OpenCV进行人脸检测的结果:

    在这里插入图片描述

    方式二:

    ​ 除了上述方式,还可以将opencv-452.jar安装到本地仓库或私有仓库,然后在pom.xml中引入依赖。

    在这里插入图片描述

    pom.xml文件中,通过坐标的形式引入

    
    <dependency>
        <groupId>org.opencvgroupId>
        <artifactId>opencvartifactId>
        <version>4.5.2version>
        <scope>systemscope>
        <systemPath>${basedir}/lib/opencv-460.jarsystemPath>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    验证
    public class MyTest 
    {
    	// 调用OpenCV库文件
        static 
        {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        }
    
        public static void main(String args[])
        {
            // 创建一个3X3的对角矩阵
            Mat a = Mat.eye(3, 3, CvType.CV_8UC1);
            System.out.println(a.dump());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    执行上述代码,不出意外将出现如下异常:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java460 in java.library.path
    	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
    	at java.lang.Runtime.loadLibrary0(Runtime.java:871)
    	at java.lang.System.loadLibrary(System.java:1122)
    
    • 1
    • 2
    • 3
    • 4

    解决方案有2种:

    1.将D:\Java\opencv\build\java\x64\opencv_java452.dll文件拷贝至下面2个目录,任选其一即可。

    在这里插入图片描述

    在这里插入图片描述

    2.通过指定虚拟机参数解决:

    try
    {
        String openCVDllName = "D:\\Java\\opencv\\build\\java\\x64\\opencv_java452.dll";
        // 本文使用 openCV4.5.2
        System.load(openCVDllName);
    }
    catch (SecurityException e)
    {
        System.out.println(e.toString());
        System.exit(-1);
    }
    catch (UnsatisfiedLinkError e)
    {
        System.out.println(e.toString());
        System.exit(-1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    ​ 以下是一个简单的Java代码示例,演示如何使用OpenCV进行人脸识别。这个示例使用了OpenCV的Haar级联分类器来检测图像中的人脸。确保你已经将OpenCV的JAR文件添加到你的Java项目中。

    import org.opencv.core.*;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    import org.opencv.objdetect.CascadeClassifier;
    
    /**
     * 描述:描述:Java中利用OpenCV进行人脸识别
     *
     * @author 为一道彩虹
     */
    public class DetectFaceDemo
    {
        public static void detectFace(String imagePath, String outFile) throws Exception
        {
            System.out.println("开始人脸检测...");
    
            // 加载人脸分类器
            String xmlFile = "D://haarcascade_frontalface_alt.xml";
            CascadeClassifier faceDetector = new CascadeClassifier(xmlFile);
    
            Mat image = Imgcodecs.imread(imagePath);
            // 在图片中检测人脸
            MatOfRect faceDetections = new MatOfRect();
            faceDetector.detectMultiScale(image, faceDetections);
            System.out.println(String.format("检测到 %s个人脸", faceDetections.toArray().length));
    
            // 绘制人脸框
            Rect[] rects = faceDetections.toArray();
            if (rects != null && rects.length > 1)
            {
                for (Rect rect : rects)
                {
                    // 在每一个识别出来的人脸周围画出一个方框
                    Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0), 3);
                }
            }
    
            // 存储
            Imgcodecs.imwrite(outFile, image);
            System.out.println(String.format("人脸检测结果,人脸检测图片文件为:%s", outFile));
        }
    
        public static void main(String[] args) throws Exception
        {
            try
            {
                String openCVDllName = "D:\\Java\\opencv\\build\\java\\x64\\opencv_java452.dll";
                // 本文使用 openCV4.5.2
                System.load(openCVDllName);
            }
            catch (SecurityException e)
            {
                System.out.println(e.toString());
                System.exit(-1);
            }
            catch (UnsatisfiedLinkError e)
            {
                System.out.println(e.toString());
                System.exit(-1);
            }
            // 人脸测试
            String imagePath = "D:\\Test\\1553247564696949.jpg";
            detectFace(imagePath, "D:\\face2.png");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    利用 OpenCV进行人脸检测的结果:

    在这里插入图片描述

    在这里插入图片描述

    总结:

    在Java中使用OpenCV进行人脸识别通常涉及以下步骤:

    1. 安装 OpenCV: 首先,确保你已经在你的Java项目中安装了OpenCV库。你可以通过Maven或手动下载并添加OpenCV的JAR文件到你的项目中。
    2. 加载 OpenCV 库: 在你的Java代码中,你需要加载OpenCV库。这可以通过以下方式之一完成:
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
    • 1

    或者,如果你使用的是OpenCV的Java wrapper,你可以使用:

    nu.pattern.OpenCV.loadShared();
    
    • 1
    1. 读取图像: 使用OpenCV的 Mat 类来加载图像。这是OpenCV中表示图像的数据结构。
    Mat image = Imgcodecs.imread("path/to/your/image.jpg");
    
    • 1
    1. 加载人脸分类器: 为了进行人脸检测,你需要使用Haar级联分类器。OpenCV提供了训练好的人脸检测器,你可以从OpenCV官方网站下载。
    String xmlFile = "path/to/haarcascade_frontalface_default.xml";
    CascadeClassifier faceDetector = new CascadeClassifier(xmlFile);
    
    • 1
    • 2
    1. 人脸检测: 使用加载的分类器对图像进行人脸检测。
    MatOfRect faceDetections = new MatOfRect();
    faceDetector.detectMultiScale(image, faceDetections);
    
    • 1
    • 2
    1. 绘制人脸框: 遍历检测到的人脸并在图像上绘制矩形框。
    for (Rect rect : faceDetections.toArray()) 
    {
        Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
    }
    
    • 1
    • 2
    • 3
    • 4
    1. 显示结果: 可以使用OpenCV的窗口显示图像。
    HighGui.imshow("Detected Face", image);
    HighGui.waitKey();
    
    • 1
    • 2
    1. 释放资源: 当你完成所有操作后,确保释放OpenCV对象。
    image.release();
    
    • 1

    请注意,以上代码只是一个简单的示例。在实际应用中,你可能需要处理图像的各种情况,例如图像预处理、性能优化等。此外,你还可以使用深度学习模型进行人脸识别,OpenCV也提供了对深度学习模型的支持。

    先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
    码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!

  • 相关阅读:
    Motion Tuned Spatio-temporal Quality Assessmentof Natural Videos
    leetcode困难262.行程和用户
    STL学习笔记之容器
    如何优化PlantUML流程图(时序图)
    面试经典 150 题 4 —(数组 / 字符串)— 80. 删除有序数组中的重复项 II
    008 怎么取消隐藏文件扩展名
    appium ios webview
    基于 HBase & Phoenix 构建实时数仓(4)—— Kafka 集群安装部署
    vscode 快速生成标准javabean
    Linux中如何禁止普通用户使用su命令
  • 原文地址:https://blog.csdn.net/qq_54693844/article/details/134465092