御神楽的学习记录之OpenCV人脸笑容识别

本文记录了使用OpenCV进行Java环境下的笑脸识别过程,包括OpenCV环境的搭建,SVM模型的训练和笑容识别的实现,最后展示了识别效果。
摘要由CSDN通过智能技术生成


一、JavaOpenCV环境搭建

1.OpenCV下载

OpenCV官网:https://opencv.org/

2.导入OpenCv库

1)导入包
在这里插入图片描述
2)导入动态库
在这里插入图片描述
VM option输入OpenCv动态库路径:

-Djava.library.path=D:\GoogleDownload\opencv\build\java\x64;D:\GoogleDownload\opencv\build\x64\vc15\bin

在这里插入图片描述

二、人脸笑容识别

1.SVM模型训练

1)图片读取
在这里插入图片描述
读取函数

public static void getFace(String filePath) {
   
        System.out.println("读取人脸......");
        //人脸检测模型
        CascadeClassifier faceDetector = new CascadeClassifier("D:\\GoogleDownload\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml");
        //定义人脸检测
        MatOfRect faceDetections = new MatOfRect();
        //获取图像所在的文件夹
        File file = new File(filePath);
        //遍历文件夹中的所有图片
        for (File f : file.listFiles()) {
   
            //读取图片
            Mat image = Imgcodecs.imread(f.getAbsolutePath());
            //对图像进行人脸检测
            faceDetector.detectMultiScale(image, faceDetections);
            //获取人脸区域
            Rect[] rects = faceDetections.toArray();

            //存在人脸
            if (faceDetections.toArray().length > 0) {
   
                //获得人脸区域
                for (Rect rect : rects) {
   
                    Mat mat = new Mat(rect.width, rect.width, CvType.CV_8UC3);
                    for (int i = rect.x; i < rect.x + rect.width; i++) {
   
                        for (int j = rect.y; j < rect.y + rect.height; j++) {
   
                            mat.put(j - rect.y, i - rect.x, image.get(j, i));
                        }
                    }
                    //截取人脸区域
                    Imgproc.resize(mat, mat, new Size(64, 64), 0, 0, 0);
                    //保存图像
                    Imgcodecs.imwrite("D:\\SmileRecongnize\\genki4k\\files" + f.getName(), mat);
                }
            }
        }
        System.out.println("读取人脸完毕");
    }

2)图片分组

public static void getRandomFile(String filePath) {
   
        System.out.println("图片随机分组......");
        File file = new File(filePath);
        File listFile[] = file.listFiles();
        Random random = new Random();
        //初始化标签
        //前2162为笑脸
        for (int i = 0; i < 3670; i++) {
   
            String no = listFile[i].getName().substring(4, 8);
            if (Integer.parseInt(no) <= 2162)
                flags[Integer.parseInt(no)] = 1;
            else
                flags[(Integer.parseInt(no))] = 0;
        }
        //随机排列,连同标签一起排列
        for (int i = 0; i < 3670; i++) {
   
            int r = random.nextInt(i + 1);
            File tmp = listFile[i];
            listFile[i] = listFile[r];
            listFile[r] = tmp;
            int t = flags[i];
            flags[i] = flags[r];
            flags[r] = t;
        }
        //分组
        for (int i = 0; i < 10; i++) {
   
            for (int j = 0; j < 367; j++) {
   
                randomFiles[i][j] = listFile[i * 367 + j];
            }
        }
        System.out.println("图片随机分组完毕");
    }

3)图片处理

public static void handleFace() {
   
        //最好得分
        double best 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值