使用OpenCV进行人脸识别,计算两张图片的相似度

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

/**
 * 这是使用OpenCV进行人脸识别的演示。
 */
public class FaceRecognitionDemo {

    public static void main(String[] args) {
        // 加载OpenCV库
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

        // 加载人脸检测分类器
        CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_alt.xml");

        // 加载要处理的图像
        Mat image1 = Imgcodecs.imread("test1.jpg");
        Mat image2 = Imgcodecs.imread("test2.jpg");

        // 在图像中检测人脸
        MatOfRect faceDetections1 = new MatOfRect();
        MatOfRect faceDetections2 = new MatOfRect();
        faceDetector.detectMultiScale(image1, faceDetections1);
        faceDetector.detectMultiScale(image2, faceDetections2);

        // 打印检测到的人脸数
        System.out.println(String.format("第一张图片检测到%s张人脸", faceDetections1.toArray().length));
        System.out.println(String.format("第二张图片检测到%s张人脸", faceDetections2.toArray().length));

        // 在检测到的人脸周围画矩形
        for (Rect rect : faceDetections1.toArray()) {
            Imgproc.rectangle(image1, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                    new Scalar(0, 255, 0));
        }
        for (Rect rect : faceDetections2.toArray()) {
            Imgproc.rectangle(image2, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                    new Scalar(0, 255, 0));
        }

        // 保存结果图像
        Imgcodecs.imwrite("result.jpg", image1);
        Imgcodecs.imwrite("result2.jpg", image2);

        // 计算两张图片的相似度
        double similarity = compareImages(image1, image2);
        System.out.println(String.format("两张图片的相似度为%s", similarity));
    }

    /**
     * 计算两张图片的相似度
     * @param image1 第一张图片
     * @param image2 第二张图片
     * @return 相似度
     */
    private static double compareImages(Mat image1, Mat image2) {
        // 计算两张图片的直方图
        Mat hist1 = new Mat();
        Mat hist2 = new Mat();
        Imgproc.calcHist(Arrays.asList(image1), new MatOfInt(0), new Mat(), hist1, new MatOfInt(256), new MatOfFloat(0, 256));
        Imgproc.calcHist(Arrays.asList(image2), new MatOfInt(0), new Mat(), hist2, new MatOfInt(256), new MatOfFloat(0, 256));

        // 归一化直方图
        Core.normalize(hist1, hist1);
        Core.normalize(hist2, hist2);

        // 计算直方图相似度
        double similarity = Imgproc.compareHist(hist1, hist2, Imgproc.CV_COMP_CORREL);
        return similarity;
    }
}

有人试了告诉我行不行

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个计算机视觉库,它可以用于人脸识别图片相似度检测。在使用OpenCV进行图片相似度检测时,可以将两张图片加载为bitmap,然后将bitmap转换为Mat矩阵。接着,将Mat矩阵的类型转换为Cv_8uc1类型,然后再转换为Cv_32F类型。通过OpenCV的方法,可以比较这两个矩阵的相似度。如果想要识别一张图片是否人脸,需要使用一个人脸的Haar特征分类器,它是一个描述人脸特征值的XML文件。将该XML文件加载到内存中,并将图片加载为bitmap。然后将bitmap转换为Mat矩阵,通过调用OpenCV的CascadeClassifier人脸探测器方法,在该Mat矩阵中检测是否人脸。如果有人脸,可以获取到人脸的区域信息,然后可以将人脸在屏幕上进行标记。当想要识别两张图片中的人脸是否是同一个人时,可以通过比较两个人脸的区域信息的相似度来判断。具体步骤包括将两个人脸的区域信息转换为Rect数组,然后比较这两个Rect数组的相似度。以上是使用OpenCV进行人脸相似度识别的大致思路和步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [OpenCV 人脸识别图片相似度检测](https://blog.csdn.net/u014608640/article/details/100738785)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Python基于OpenCV人脸集合相似度检测系统(源码&UI&教程)](https://blog.csdn.net/cheng2333333/article/details/126652173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值