热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java使用Opencv进行人脸识别

最近项目上需要用Java做人脸识别,上手了两个星期的Opencv对于人脸识别也有了一定的认识.首先,我们需要下载Opencv官网:opencv.org我用的是4

最近项目上需要用Java做人脸识别,上手了两个星期的Opencv对于人脸识别也有了一定的认识.

首先,我们需要下载Opencv

官网:opencv.org

我用的是4.10版本

点击Release进行下载Opencv

下载好后 在Eclipse中配置Opencv

Window-Perference-Java-Build Path-User Libraries->New

添加一个新的用户库

然后将Opencv目录下Build-Java中的jar包添加进库

然后设置jar包中的Native library location为对应的C++生成的dll文件 一般在OpenCV的jar中的 X64文件夹或者X86

配置好后就可以进行编写代码了

下面是我用到的API 自己通过理解进行翻译的

-------------------------

API
org.opencv.core包
    Core类
        NATIVE_LIBRARY_NAME                返回一个字符串,内容为库的名称
        
        
    Mat类(图片类)
        Mat(Mat,Rect);                    获取一个图片,为分割后的mat
        size();                            返回一个Size,行数列数
        depth();                        返回一个int,像素深度
        channels();                        返回一个int,通道数
        rows();                            返回一个int,行数
        cols();                            返回一个int,列数
        type();                            返回一个int,创建的矩阵的类型
        release();                        释放资源-会自动调用,所以一般不需要
        clone();                        复制Mat
        eye(int rows,int cols,int type);代表一个单位矩阵
        dump();
    
    MatOfRect类(图片范围类)
        size();                            返回一个Size 输出为到检测的人脸
        size(int);                        返回一个int    如果int为0 则返回检测到的人脸数量
        toArray();                        返回一个Rect数组
        
    CvType类
    
    Scalar类(颜色)
        
org.opencv.objdetect包
    CascadeClassifier类(级联分类器)
        load(String fileName);            返回一个boolean 加载OpenCv中的xml文件,加载成功返回true否则返回false
        detectMultiScale(Mat,MatOfRect,double,int,int,Size);    通过指定的xml文件检测人脸,将值保存在MatofRect中
            mat为输入的灰度图像
            MatOfRect为得到被检测物体的矩形框向量组
            double为每一个图像尺度中的尺度参数,默认值为1.1,可以决定两个不同大小的窗口扫描之间有多大的跳跃
                这个参数设置的大,则意味着计算会变快,但如果窗口错过了某个大小的人脸,则可能丢失物体
            int为每一个级联矩形应该保留的临近个数,默认为3,控制着误检测,
                默认值为3表明至少有3次重叠检测,我们才认为人脸实存
            int对于新的分类器没有用,为0就行
            Size指示寻找人脸的最小区域,设置这个参数过大,会以丢失小物体为代价减少计算量
            
org.opencv.videoio包
    VideoCapture类(视频捕捉)
        VideoCapture(int index);        如果为0则打开本地摄像头
        VideoCapture(String fileName);    读取视频
    
        isOpened();                        返回boolean,视频不能打开返回false
        open(String fileName);            读取视频
        read(Mat image);                获取,解码并返回下一个视频帧,保存在image内

        release();                        关闭
    
org.opencv.imgproc包
    Imgproc类
        COLOR_BGR2GRAY;                    灰色
        cvtColor(Mat,Mat,int,int);        灰度格式
            第一个参数是原图像,第二个参数是转换后的图像保存的变量
        rectangle(Mat,Rect,Scalar);        画矩形
        calcHist
org.opencv.imgcodecs包
    Imgcodecs类
        imread(String fileName);            返回一个Mat,读取图片
        imwrite(String fileName,Mat img);    保存mat为图片,fileName为保存的路径

--------------------------

将库在项目中引用

要想用Opencv首先得加载库

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

做人脸检测很简单

只需要用CascadeClassifier类就行了

加载opencv给我们提供的训练好的xml文件--在Opencv-source-data目录下 我这里用的haarcascades这个目录里的

private CascadeClassifier faceCascade;//人脸检测器static {//加载库System.loadLibrary(Core.NATIVE_LIBRARY_NAME);//获取人脸检测器faceCascade = new CascadeClassifier(人脸的xml文件-haarcascade_frontalface_alt.xml);
}
/*** -检测人脸 根据一张mat*/
public static Mat detectFace(Mat mat) {//检测到的人脸的位置-矩形集MatOfRect rect = new MatOfRect();//进行检测 根据一个Mat,将结果返回到MatOfRect中faceCascade.detectMultiScale(mat,rect);//遍历rect 给每个人脸画个框Rect[] re = rect.toArray();for (Rect r : re) {//给图片上画框框 参数1是图片 参数2是矩形 参数3是颜色 参数四是画出来的线条大小Imgproc.rectangle(mat,r,new Scalar(0,0,255),2);}//输出图片Imgcodecs.imwrite(路径+1.jpg,mat);
}

不同的分类器检测出来的效果也会不同

并且detectMultiScale方法里有很多参数可以设置,更改有不同效果

人脸识别的话首先需要一个人脸库

--这里建议用Javacv 因为要做人脸识别需要contrib模块

JavaCv已经整合好了

目前我的解决方法是用百度AI上进行人脸识别

--------待学习

如果各位有会的话请在下方评论


推荐阅读
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 基于试题数据的智能化管理平台采用Java语言进行面向对象编程,旨在构建一个高效的试题信息管理系统。该系统在JDK 6.0和MyEclipse 10.6环境下开发,通过优化试题数据管理和处理流程,提升系统的稳定性和用户体验。平台支持多用户操作,具备强大的数据处理能力和灵活的扩展性,适用于各类教育机构和考试组织。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • 将JavaScript文件嵌入HTML文档是Web开发中的基本操作。常见的方法是通过在HTML文件中使用``标签来引用外部的.js文件。这种方法不仅保持了代码的整洁性,还便于管理和维护。此外,还可以利用模块化脚本和异步加载技术进一步提升页面性能。 ... [详细]
  • Dense Matrix Inversion Results in Segmentation Fault: Causes and Solutions ... [详细]
  • 动态壁纸 LiveWallPaper:让您的桌面栩栩如生(第二篇)
    在本文中,我们将继续探讨如何开发动态壁纸 LiveWallPaper,使您的桌面更加生动有趣。作为 2010 年 Google 暑期大学生博客分享大赛 Android 篇的一部分,我们将详细介绍 Ed Burnette 的《Hello, Android》第三版中的相关内容,并分享一些实用的开发技巧和经验。通过本篇文章,您将了解到如何利用 Android SDK 创建引人入胜的动态壁纸,提升用户体验。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
author-avatar
天天宅家里变胖的小黑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有