IT评测·应用市场-qidao123.com

标题: JavaCV人脸识别三部曲之三:识别和预览 [打印本页]

作者: 愛在花開的季節    时间: 2023-6-30 08:41
标题: JavaCV人脸识别三部曲之三:识别和预览
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
《JavaCV人脸识别三部曲》链接

本篇概览


理解重点概念:confidence

理解重点概念:threshold

源码下载

名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议
编码:人脸识别服务

  1. package com.bolingcavalry.grabpush.extend;
  2. import lombok.Data;
  3. @Data
  4. public class PredictRlt {
  5.     private int lable;
  6.     private double confidence;
  7. }
复制代码
  1. package com.bolingcavalry.grabpush.extend;
  2. import com.bolingcavalry.grabpush.Constants;
  3. import org.bytedeco.opencv.global.opencv_imgcodecs;
  4. import org.bytedeco.opencv.opencv_core.Mat;
  5. import org.bytedeco.opencv.opencv_core.Size;
  6. import org.bytedeco.opencv.opencv_face.FaceRecognizer;
  7. import org.bytedeco.opencv.opencv_face.FisherFaceRecognizer;
  8. import static org.bytedeco.opencv.global.opencv_imgcodecs.IMREAD_GRAYSCALE;
  9. import static org.bytedeco.opencv.global.opencv_imgproc.resize;
  10. /**
  11. * @author willzhao
  12. * @version 1.0
  13. * @description 把人脸识别的服务集中在这里
  14. * @date 2021/12/12 21:32
  15. */
  16. public class RecognizeService {
  17.     private FaceRecognizer faceRecognizer;
  18.     // 推理结果的标签
  19.     private int[] plabel;
  20.     // 推理结果的置信度
  21.     private double[] pconfidence;
  22.     // 推理结果
  23.     private PredictRlt predictRlt;
  24.     // 用于推理的图片尺寸,要和训练时的尺寸保持一致
  25.     private Size size= new Size(Constants.RESIZE_WIDTH, Constants.RESIZE_HEIGHT);
  26.     public RecognizeService(String modelPath) {
  27.         plabel = new int[1];
  28.         pconfidence = new double[1];
  29.         predictRlt = new PredictRlt();
  30.         
  31.         // 识别类的实例化,与训练时相同
  32.         faceRecognizer = FisherFaceRecognizer.create();
  33.         // 加载的是训练时生成的模型
  34.         faceRecognizer.read(modelPath);
  35.         // 设置门限,这个可以根据您自身的情况不断调整
  36.         faceRecognizer.setThreshold(Constants.MAX_CONFIDENCE);
  37.     }
  38.     /**
  39.      * 将Mat实例给模型去推理
  40.      * @param mat
  41.      * @return
  42.      */
  43.     public PredictRlt predict(Mat mat) {
  44.         // 调整到和训练一致的尺寸
  45.         resize(mat, mat, size);
  46.         boolean isFinish = false;
  47.         try {
  48.             // 推理(这一行可能抛出RuntimeException异常,因此要补货,否则会导致程序退出)
  49.             faceRecognizer.predict(mat, plabel, pconfidence);
  50.             isFinish = true;
  51.         } catch (RuntimeException runtimeException) {
  52.             runtimeException.printStackTrace();
  53.         }
  54.         // 如果发生过异常,就提前返回
  55.         if (!isFinish) {
  56.             return null;
  57.         }
  58.         // 将推理结果写入返回对象中
  59.         predictRlt.setLable(plabel[0]);
  60.         predictRlt.setConfidence(pconfidence[0]);
  61.         return predictRlt;
  62.     }
  63. }
复制代码
编码:检测和识别

  1. package com.bolingcavalry.grabpush.extend;
  2. import com.bolingcavalry.grabpush.Constants;
  3. import org.bytedeco.javacv.Frame;
  4. import org.bytedeco.javacv.OpenCVFrameConverter;
  5. import org.bytedeco.opencv.opencv_core.*;
  6. import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;
  7. import static org.bytedeco.opencv.global.opencv_core.CV_8UC1;
  8. import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite;
  9. import static org.bytedeco.opencv.global.opencv_imgproc.*;
  10. /**
  11. * @author willzhao
  12. * @version 1.0
  13. * @description 检测工具的通用接口
  14. * @date 2021/12/5 10:57
  15. */
  16. public interface DetectService {
  17.     /**
  18.      * 根据传入的MAT构造相同尺寸的MAT,存放灰度图片用于以后的检测
  19.      * @param src 原始图片的MAT对象
  20.      * @return 相同尺寸的灰度图片的MAT对象
  21.      */
  22.     static Mat buildGrayImage(Mat src) {
  23.         return new Mat(src.rows(), src.cols(), CV_8UC1);
  24.     }
  25.    
  26.     /**
  27.      * 初始化操作,例如模型下载
  28.      * @throws Exception
  29.      */
  30.     void init() throws Exception;
  31.     /**
  32.      * 得到原始帧,做识别,添加框选
  33.      * @param frame
  34.      * @return
  35.      */
  36.     Frame convert(Frame frame);
  37.     /**
  38.      * 释放资源
  39.      */
  40.     void releaseOutputResource();
  41. }
复制代码
[code]package com.bolingcavalry.grabpush.extend;import lombok.extern.slf4j.Slf4j;import org.bytedeco.javacpp.Loader;import org.bytedeco.javacv.Frame;import org.bytedeco.javacv.OpenCVFrameConverter;import org.bytedeco.opencv.opencv_core.*;import org.bytedeco.opencv.opencv_objdetect.CascadeClassifier;import java.io.File;import java.net.URL;import java.util.Map;import static org.bytedeco.opencv.global.opencv_imgproc.*;/** * @author willzhao * @version 1.0 * @description 音频相关的服务 * @date 2021/12/3 8:09 */@Slf4jpublic class DetectAndRecognizeService implements DetectService {    /**     * 每一帧原始图片的对象     */    private Mat grabbedImage = null;    /**     * 原始图片对应的灰度图片对象     */    private Mat grayImage = null;    /**     * 分类器     */    private CascadeClassifier classifier;    /**     * 转换器     */    private OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();    /**     * 检测模型文件的下载地址     */    private String detectModelFileUrl;    /**     * 处理每一帧的服务     */    private RecognizeService recognizeService;    /**     * 为了显示的时候更加友好,给每个分类对应一个名称     */    private Map kindNameMap;    /**     * 构造方法     * @param detectModelFileUrl     * @param recognizeModelFilePath     * @param kindNameMap     */    public DetectAndRecognizeService(String detectModelFileUrl, String recognizeModelFilePath, Map kindNameMap) {        this.detectModelFileUrl = detectModelFileUrl;        this.recognizeService = new RecognizeService(recognizeModelFilePath);        this.kindNameMap = kindNameMap;    }    /**     * 音频采样对象的初始化     * @throws Exception     */    @Override    public void init() throws Exception {        // 下载模型文件        URL url = new URL(detectModelFileUrl);        File file = Loader.cacheResource(url);        // 模型文件下载后的完整地址        String classifierName = file.getAbsolutePath();        // 根据模型文件实例化分类器        classifier = new CascadeClassifier(classifierName);        if (classifier == null) {            log.error("Error loading classifier file [{}]", classifierName);            System.exit(1);        }    }    @Override    public Frame convert(Frame frame) {        // 由帧转为Mat        grabbedImage = converter.convert(frame);        // 灰度Mat,用于检测        if (null==grayImage) {            grayImage = DetectService.buildGrayImage(grabbedImage);        }        // 进行人脸识别,根据结果做处理得到预览窗口显示的帧        return detectAndRecoginze(classifier, converter, frame, grabbedImage, grayImage, recognizeService, kindNameMap);    }    /**     * 程序结束前,释放人脸识别的资源     */    @Override    public void releaseOutputResource() {        if (null!=grabbedImage) {            grabbedImage.release();        }        if (null!=grayImage) {            grayImage.release();        }        if (null==classifier) {            classifier.close();        }    }    /**     * 检测图片,将检测结果用矩形标注在原始图片上     * @param classifier 分类器     * @param converter Frame和mat的转换器     * @param rawFrame 原始视频帧     * @param grabbedImage 原始视频帧对应的mat     * @param grayImage 存放灰度图片的mat     * @param kindNameMap 每个分类编号对应的名称     * @return 标注了识别结果的视频帧     */    static Frame detectAndRecoginze(CascadeClassifier classifier,                                    OpenCVFrameConverter.ToMat converter,                                    Frame rawFrame,                                    Mat grabbedImage,                                    Mat grayImage,                                    RecognizeService recognizeService,                                    Map kindNameMap) {        // 当前图片转为灰度图片        cvtColor(grabbedImage, grayImage, CV_BGR2GRAY);        // 存放检测结果的容器        RectVector objects = new RectVector();        // 开始检测        classifier.detectMultiScale(grayImage, objects);        // 检测结果总数        long total = objects.size();        // 如果没有检测到结果,就用原始帧返回        if (total




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4