java + opencv对比图片不同

这篇具有很好参考价值的文章主要介绍了java + opencv对比图片不同。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1,去官网下载opencv,下载的时候需要注册一个 Oracle 账户,分分钟就能注册。然后安装。我下的是4.7的。

java opencv图片对比,opencv,java,人工智能

2,找到jar包放进项目里

java opencv图片对比,opencv,java,人工智能

3,项目结构,比较简单

java opencv图片对比,opencv,java,人工智能

4,把下载的文件放进C盘java opencv图片对比,opencv,java,人工智能

5,主类代码

import org.opencv.core.Core;


/**
 * @author lake
 * @date 2023/6/26
 */
public class TestMain {
    static {
        //在使用OpenCV前必须加载Core.NATIVE_LIBRARY_NAME类,否则会报错
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        String imagePath1 = "C:\\Users\\lake45\\Desktop\\yuan.jpg";
        String imagePath2 = "C:\\Users\\lake45\\Desktop\\fuben.jpg";
        ImageCompare imageCompare = new ImageCompare();
        imageCompare.CompareAndMarkDiff(imagePath1, imagePath2);
    }

}

6,工具类

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.utils.Converters;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author lake
 * @date 2023/6/26
 */
public class ImageCompare {
    private boolean compareResult = false;
    private String mark = "_compareResult";

    /**
     * 比较两张图片,如不同则将不同处标记并输出到新的图片中
     *
     * @param imagePath1 图片1的路径
     * @param imagePath2 图片2的路径
     */
    public void CompareAndMarkDiff(String imagePath1, String imagePath2) {
        Mat mat1 = readMat(imagePath1);
        Mat mat2 = readMat(imagePath2);
        mat1 = Imgcodecs.imdecode(mat1, Imgcodecs.IMREAD_UNCHANGED);
        mat2 = Imgcodecs.imdecode(mat2, Imgcodecs.IMREAD_UNCHANGED);

        if (mat1.cols() == 0 || mat2.cols() == 0 || mat1.rows() == 0 || mat2.rows() == 0) {
            System.out.println("图片文件路径异常,获取的图片大小为0,无法读取");
            return;
        }
        if (mat1.cols() != mat2.cols() || mat1.rows() != mat2.rows()) {
            System.out.println("两张图片大小不同,无法比较");
            return;
        }
        mat1.convertTo(mat1, CvType.CV_8UC1);
        mat2.convertTo(mat2, CvType.CV_8UC1);
        Mat mat1_gray = new Mat();
        Imgproc.cvtColor(mat1, mat1_gray, Imgproc.COLOR_BGR2GRAY);
        Mat mat2_gray = new Mat();
        Imgproc.cvtColor(mat2, mat2_gray, Imgproc.COLOR_BGR2GRAY);
        mat1_gray.convertTo(mat1_gray, CvType.CV_32F);
        mat2_gray.convertTo(mat2_gray, CvType.CV_32F);
        double result = Imgproc.compareHist(mat1_gray, mat2_gray, Imgproc.CV_COMP_CORREL);
        if (result == 1) {
            compareResult = true;//此处结果为1则为完全相同
            return;
        }
        System.out.println("相似度数值为:" + result);
        Mat mat_result = new Mat();
        //计算两个灰度图的绝对差值,并输出到一个Mat对象中
        Core.absdiff(mat1_gray, mat2_gray, mat_result);
        //将灰度图按照阈值进行绝对值化
        mat_result.convertTo(mat_result, CvType.CV_8UC1);
        List<MatOfPoint> mat2_list = new ArrayList<MatOfPoint>();
        Mat mat2_hi = new Mat();
        //寻找轮廓图
        Imgproc.findContours(mat_result, mat2_list, mat2_hi, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
        Mat mat_result1 = mat1;
        Mat mat_result2 = mat2;
        //使用红色标记不同点
        System.out.println(mat2_list.size());
        for (MatOfPoint matOfPoint : mat2_list) {
            Rect rect = Imgproc.boundingRect(matOfPoint);
            Imgproc.rectangle(mat_result1, rect.tl(), rect.br(), new Scalar(0, 0, 255), 2);
            Imgproc.rectangle(mat_result2, rect.tl(), rect.br(), new Scalar(0, 0, 255), 2);
        }
        String fileName1 = getFileName(imagePath1);
        String targetPath1 = getParentDir(imagePath2) + File.separator + fileName1.replace(".", mark + ".");
        String fileName2 = getFileName(imagePath2);
        String targetPath2 = getParentDir(imagePath2) + File.separator + fileName2.replace(".", mark + ".");
        //图片一的带标记的输出文件;
        writeImage(mat_result1, targetPath1);
        //图片二的带标记的输出文件;
        writeImage(mat_result2, targetPath2);
    }

    private void writeImage(Mat mat, String outPutFile) {
        MatOfByte matOfByte = new MatOfByte();
        Imgcodecs.imencode(".png", mat, matOfByte);
        byte[] byteArray = matOfByte.toArray();
        BufferedImage bufImage = null;
        try {
            InputStream in = new ByteArrayInputStream(byteArray);
            bufImage = ImageIO.read(in);
            ImageIO.write(bufImage, "png", new File(outPutFile));
        } catch (IOException | HeadlessException e) {
            e.printStackTrace();
        }
    }

    private String getFileName(String filePath) {
        File f = new File(filePath);
        return f.getName();
    }

    private String getParentDir(String filePath) {
        File f = new File(filePath);
        return f.getParent();
    }

    private Mat readMat(String filePath) {
        try {
            File file = new File(filePath);
            FileInputStream inputStream = new FileInputStream(filePath);
            byte[] byt = new byte[(int) file.length()];
            int read = inputStream.read(byt);
            List<Byte> bs = convert(byt);
            Mat mat1 = Converters.vector_char_to_Mat(bs);
            return mat1;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new Mat();
    }

    private List<Byte> convert(byte[] byt) {
        List<Byte> bs = new ArrayList<Byte>();
        for (int i = 0; i < byt.length; i++) {
            bs.add(i, byt[i]);
        }
        return bs;
    }

}

7,效果图。如果是一张彩色和一张黑白的图片,效果就不太理想了。

java opencv图片对比,opencv,java,人工智能

资源文件地址,我设置了0积分下载:

https://download.csdn.net/download/qq_30299243/87950327?spm=1001.2014.3001.5503文章来源地址https://www.toymoban.com/news/detail-666630.html

到了这里,关于java + opencv对比图片不同的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能前沿研究综述:对比学习、迁移学习、知识蒸馏的探索与未来展望

    导言         随着人工智能领域的不断发展,对比学习、迁移学习和知识蒸馏等研究方向成为热门话题。本文将全面探讨这些前沿研究的发展、面临的问题、解决过程,以及未来可能的研究趋势。 1. 对比学习的发展与挑战               1.1 发展历程         演

    2024年01月22日
    浏览(58)
  • 人工智能——“kmeans实现图片分割”(Python实现)

    (2)边缘分割:对图像边缘进行检测,即检测图像中灰度值发生跳变的地方,则为一片 区域的边缘。 (3)直方图法:对图像的颜色建立直方图,而直方图的波峰波谷能够表示一块区域的颜 色值的范围,来达到分割的目的。 (4)特定理论:基于 聚类分析 、小波变换等理论完成图像

    2024年04月17日
    浏览(39)
  • 基于Springboot+百度AI人工智能图像图片智能处理系统设计与实现

    基于Springboot+百度AI人工智能图像图片智能处理系统设计与实现  博主介绍: 《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,

    2024年02月05日
    浏览(62)
  • AI人工智能一键图片/视频换脸-Roop

    Roop 换脸技术是一种基于深度学习的人脸图像处理技术。 Roop换脸技术的实现主要分为两个步骤: 人脸检测与对齐 、 特征融合与生成 。 1.人脸检测与对齐在Roop换脸技术中,首先需要对输入的图像进行人脸检测与对齐。这一步骤的目的是确保输入的两张图像中的人脸位置和角

    2024年02月13日
    浏览(56)
  • 人工智能-OpenCV+Python实现人脸识别(人脸检测)

    在OpenCV中使用Haar特征检测人脸,那么需要使用OpenCV提供的xml文件(级联表)在haarcascades目录下。这张级联表有一个训练好的AdaBoost训练集。首先要采用样本的Haar特征训练分类器,从而得到一个级联的AdaBoost分类器。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征

    2024年02月06日
    浏览(104)
  • 陶哲轩工作流之人工智能数学验证+定理发明工具LEAN4 [线性代数篇2前置知识]不同求和范围不同函数项结果相等的条件

    有空点赞我的视频哦:陶哲轩工作流之人工智能数学验证+定理发明工具LEAN4 [线性代数篇2前置知识]不同求和范围不同函数项结果相等的条件_哔哩哔哩_bilibili -- 反向推理 refine\\\' sum_bij _ _ _ _ _ -- {s : Finset α} {t : Finset γ} {f : α → β} {g : γ → β} -- (i : ∀ a ∈ s, γ) -- (hi : ∀ a ha,

    2024年01月17日
    浏览(53)
  • 人工智能算法工程师面试题——之OpenCV必背汇总(四)

    在OpenCV中,图像融合通常指的是将两个或更多图像以某种方式组合在一起,以创建一个新的图像。这个过程可以用于多种目的,比如艺术效果、图像修复或信息增强。实现图像融合的一种常见方法是通过加权求和,也就是每个像素位置上将不同图像的像素值按照一定的权重相

    2024年02月21日
    浏览(50)
  • 如何使用Java进行人工智能开发?

    Java作为一门面向对象的编程语言,在人工智能领域也发挥着重要作用。Java可以借助常见的机器学习库,例如TensorFlow和Keras等,进行机器学习和深度学习的开发。下面是使用Java进行人工智能开发的一些步骤和工具。 准备工作 在使用Java进行人工智能开发之前,需要掌握Java的基

    2024年02月21日
    浏览(50)
  • Java与人工智能:共创未来

    随着人工智能(AI)技术的迅猛发展,它已经成为我们日常生活和工作中不可或缺的一部分。在这个充满变革的时代,Java作为一种成熟的编程语言,正在与人工智能紧密结合,共同创造着更加智能化的未来。                        Java作为一种面向对象的编程语言,具有跨

    2024年02月01日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包