Java使用Opencv进行人脸识别

4 篇文章 0 订阅
1 篇文章 0 订阅

最近项目上需要用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上进行人脸识别

--------待学习

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

要在Java使用OpenCV实现人脸识别,需要以下几个步骤: 1.下载安装OpenCV库 首先需要下载并安装OpenCV库,可以到官方网站https://opencv.org/releases/下载适合自己环境的版本,然后按照安装指南进行安装。 2.导入OpenCV库 在Java项目中,需要使用OpenCV库的功能,需要将OpenCV库导入到项目中。具体导入方式可以查看OpenCV官方文档https://docs.opencv.org/3.4/d9/df8/tutorial_root.html。 3.载入训练好的人脸分类器 OpenCV提供了一些训练好的人脸分类器,可以用来检测人脸。可以在OpenCV库中找到这些分类器文件,然后使用Java代码将其载入。 4.读取图片或视频流 使用Java代码读取图片或视频流,可以使用OpenCV中提供的Imgcodecs类进行图片读取,也可以使用VideoCapture类进行视频流读取。 5.使用人脸分类器检测人脸 使用OpenCV中提供的CascadeClassifier类,将训练好的人脸分类器载入,并使用detectMultiScale方法在图片或视频流中检测人脸。 6.标记人脸并显示 使用Java代码标记出检测到的人脸位置,并将结果显示在图片或视频流中。 下面是一个简单的Java代码示例: ``` import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.objdetect.CascadeClassifier; public class FaceDetection { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 载入人脸分类器 CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_alt.xml"); // 读取图片 Mat image = Imgcodecs.imread("test.jpg"); // 检测人脸 MatOfRect faceDetections = new MatOfRect(); faceDetector.detectMultiScale(image, faceDetections); // 标记人脸并显示 for (Rect rect : faceDetections.toArray()) { Imgproc.rectangle(image, rect.tl(), rect.br(), new Scalar(0, 255, 0), 3); } Imgcodecs.imwrite("result.jpg", image); } } ``` 在这个示例中,我们载入了一个人脸分类器文件"haarcascade_frontalface_alt.xml",然后读取了一张图片"test.jpg",使用人脸分类器检测人脸,并标记人脸位置,并将结果保存在"result.jpg"中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HackShendi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值