zoukankan      html  css  js  c++  java
  • Java OpenCV-4.0.0 比较两个图片的相似度2

    import org.opencv.core.*;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
    import org.opencv.objdetect.CascadeClassifier;
    
    import java.util.Arrays;
    
    public class FaceCompareMain {
    
        //初始化人脸探测器
        static CascadeClassifier faceDetector;
    
        static {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
            faceDetector = new CascadeClassifier(
                "D:\ib\face-detact\src\com\company\haarcascade_frontalface_alt.xml");
        }
    
        // 1.  灰度化(减小图片大小)
        // 2. 人脸识别
        // 3. 人脸切割
        // 4. 规一化(人脸直方图)
        // 5. 直方图相似度匹配
    
        public static void main(String[] args) {
            String basePicPath = "D:\ib\face-detact\src\pics\";
            double compareHist = compare_image(basePicPath + "11_1.png", basePicPath + "11_2.png");
            System.out.println(compareHist);
            if (compareHist > 0.72) {
                System.out.println("人脸匹配");
            } else {
                System.out.println("人脸不匹配");
            }
        }
    
        public static double compare_image(String img_1, String img_2) {
            Mat mat_1 = conv_Mat(img_1);
            Mat mat_2 = conv_Mat(img_2);
    
            Mat hist_1 = new Mat();
            Mat hist_2 = new Mat();
    
            //颜色范围
            MatOfFloat ranges = new MatOfFloat(0f, 256f);
            //直方图大小, 越大匹配越精确 (越慢)
            MatOfInt histSize = new MatOfInt(1000);
    
            Imgproc.calcHist(Arrays.asList(mat_1), new MatOfInt(0), new Mat(), hist_1, histSize, ranges);
            Imgproc.calcHist(Arrays.asList(mat_2), new MatOfInt(0), new Mat(), hist_2, histSize, ranges);
    
            // CORREL 相关系数
            double res = Imgproc.compareHist(hist_1, hist_2, Imgproc.CV_COMP_CORREL);
            return res;
        }
    
        // "D:\ib\face-detact\src\com\company\a1.jpg"
        private static Mat conv_Mat(String img_1) {
            Mat image0 = Imgcodecs.imread(img_1);
    
            Mat image = new Mat();
            //灰度转换
            Imgproc.cvtColor(image0, image, Imgproc.COLOR_BGR2GRAY);
    
            MatOfRect faceDetections = new MatOfRect();
            //探测人脸
            faceDetector.detectMultiScale(image, faceDetections);
    
            // rect中是人脸图片的范围
            for (Rect rect : faceDetections.toArray()) {
                //切割rect人脸
                Mat mat = new Mat(image, rect);
                return mat;
            }
            return null;
        }
    
    }
  • 相关阅读:
    testing
    mysql的collation
    使用elk+redis搭建nginx日志分析平台
    安装logstash,elasticsearch,kibana三件套
    技术晨读_2014_12_22
    laravel中的错误与日志
    maven仓库--私服(Nexus的配置使用)
    Youtube的论文《Deep Neural Networks for YouTube Recommendations》
    2018中国区块链应用生态发展报告
    阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) ,阿里百万级QPS资源调度系统,一般的服务器qps多少? QPS/TPS/并发量/系统吞吐量
  • 原文地址:https://www.cnblogs.com/interdrp/p/15435247.html
Copyright © 2011-2022 走看看