智能图像处理平台:图像处理配置类

news2025/4/10 9:12:49

这里我们先修改一下依赖,不用JavaCV,用openCV。

导入依赖:

        <!-- JavaCV 依赖,用于图像和视频处理 -->
<!--        <dependency>-->
<!--            <groupId>org.bytedeco</groupId>-->
<!--            <artifactId>javacv</artifactId>-->
<!--            <version>1.5.10</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.bytedeco</groupId>-->
<!--            <artifactId>javacpp</artifactId>-->
<!--            <version>1.5.10</version>-->
<!--        </dependency>-->
        <!-- OpenCV,计算机视觉库 -->
        <dependency>
            <groupId>org.openpnp</groupId>
            <artifactId>opencv</artifactId>
            <version>4.6.0-0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/opencv-460.jar</systemPath>
        </dependency>

编写图像处理配置类,包括图像拉取,图像处理、图像上传三个部分:

package com.llpp.tool;

import cn.hutool.http.ContentType;
import cn.hutool.http.HttpUtil;
import com.llpp.config.MinioConfig;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.CLAHE;
import org.opencv.imgproc.Imgproc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;


/**
 * @Author 21326
 * @Date 2025 2025/2/28 23:50
 */
@Component
public class ImageOperationTool {
    @Autowired
    private MinioConfig minioConfig;
    public static ImageOperationTool imageOperationTool;
    private static String PATH = ClassUtils.getDefaultClassLoader().getResource("openCV/opencv_java460.dll").getPath();

    static {
        System.load(PATH);
    }

    @PostConstruct
    public void init() {
        imageOperationTool = this;
        imageOperationTool.minioConfig = this.minioConfig;
    }

    public static String imageOperation(String url, String operation) {
        File output = new File("processed_image.jpg");
        FileInputStream fis = null;
        try {
            // 从 URL 读取图像数据
            output = HttpUtil.downloadFileFromUrl(url, output);
            // 将图像数据转换为 OpenCV 的 Mat 对象
            Mat mat = Imgcodecs.imread(output.getAbsolutePath());
            // 根据操作类型执行相应的操作
            Mat processedMat = performOperation(mat, operation);
            // 将处理后的 Mat 对象保存为文件
            Imgcodecs.imwrite(output.getAbsolutePath(), processedMat);
            // 将文件转换为 MultipartFile 对象
            fis = new FileInputStream(output);
            MultipartFile multipartFile = new MultipartFileTool(UUID.randomUUID().toString(), "image/jpg", ContentType.OCTET_STREAM.getValue(), fis);
            // 上传到 MinIO
            return imageOperationTool.minioConfig.putObject(multipartFile);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                if (Objects.nonNull(fis)) fis.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            output.delete();
        }
        return null;
    }

    private static Mat performOperation(Mat mat, String operation) {
        switch (operation.toLowerCase()) {
            case "gray": {
                // 灰度化
                Mat grayMat = new Mat();
                Imgproc.cvtColor(mat, grayMat, Imgproc.COLOR_BGR2GRAY);
                return grayMat;
            }
            case "scale": {
                // 缩放
                Mat scaledMat = new Mat();
                Imgproc.resize(mat, scaledMat, new Size(mat.width() / 2, mat.height() / 2));
                return scaledMat;
            }
            case "gaussianblur": {
                // 高斯滤波
                Mat gaussianMat = new Mat();
                Imgproc.GaussianBlur(mat, gaussianMat, new Size(3, 3), 0);
                return gaussianMat;
            }
            case "canny": {
                // 边缘检测
                Mat cannyMat = new Mat();
                Imgproc.Canny(mat, cannyMat, 100, 200);
                return cannyMat;
            }
            case "houghlines": {
                // 霍夫直线变换
                Mat lines = new Mat();
                Imgproc.HoughLines(mat, lines, 1, Math.PI / 180, 100, 0, 0, 0, Math.PI);
                Mat resultMat = new Mat(lines.rows(), 2, CvType.CV_32F);
                for (int i = 0; i < lines.rows(); i++) {
                    double[] line = lines.get(i, 0);
                    resultMat.put(i, 0, line[0]);
                    resultMat.put(i, 1, line[1]);
                }
                return resultMat;
            }
            case "sobel": {
                // Sobel边缘检测
                Mat sobelMat = new Mat();
                Imgproc.Sobel(mat, sobelMat, CvType.CV_8U, 1, 0);
                return sobelMat;
            }
            case "laplacian": {
                Mat laplacianMat = new Mat();
                Imgproc.Laplacian(mat, laplacianMat, CvType.CV_8U);
                return laplacianMat;
            }
            case "erode": {
                Mat erodeMat = new Mat();
                Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
                Imgproc.erode(mat, erodeMat, kernel);
                return erodeMat;
            }
            case "dilate": {
                Mat dilateMat = new Mat();
                Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));
                Imgproc.dilate(mat, dilateMat, kernel);
                return dilateMat;
            }
            case "medianblur": {
                Mat medianBlurMat = new Mat();
                Imgproc.medianBlur(mat, medianBlurMat, 3);
                return medianBlurMat;
            }
            case "bilateralfilter": {
                Mat bilateralFilterMat = new Mat();
                Imgproc.bilateralFilter(mat, bilateralFilterMat, 9, 75, 75);
                return bilateralFilterMat;
            }
            case "threshold": {
                Mat thresholdMat = new Mat();
                Imgproc.threshold(mat, thresholdMat, 127, 255, Imgproc.THRESH_BINARY);
                return thresholdMat;
            }
            case "adaptivethreshold": {
                Mat adaptiveThresholdMat = new Mat();
                Imgproc.adaptiveThreshold(mat, adaptiveThresholdMat, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 11, 2);
                return adaptiveThresholdMat;
            }
            case "sift": {
                Mat siftMat = new Mat();
                return siftMat;
            }
            case "harris": {
                Mat harrisMat = new Mat();
                return harrisMat;
            }
            case "houghcircles": {
                Mat circles = new Mat();
                Imgproc.HoughCircles(mat, circles, Imgproc.HOUGH_GRADIENT, 1, mat.height() / 16, 100, 100, 0, 0);
                Mat resultMat = new Mat(circles.cols(), 3, CvType.CV_32F);
                for (int i = 0; i < circles.cols(); i++) {
                    double[] circle = circles.get(0, i);
                    resultMat.put(i, 0, circle[0]);
                    resultMat.put(i, 1, circle[1]);
                    resultMat.put(i, 2, circle[2]);
                }
                return resultMat;
            }
            case "clahe": {
                Mat claheMat = new Mat();
                CLAHE clahe = Imgproc.createCLAHE();
                clahe.apply(mat, claheMat);
                return claheMat;
            }
            case "rgb2hsv": {
                Mat hsvMat = new Mat();
                Imgproc.cvtColor(mat, hsvMat, Imgproc.COLOR_BGR2HSV);
                return hsvMat;
            }
            case "rgb2lab": {
                Mat labMat = new Mat();
                Imgproc.cvtColor(mat, labMat, Imgproc.COLOR_RGB2Lab);
                return labMat;
            }
            default:
                return mat;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2308421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一周一个Unity小游戏2D反弹球游戏 - 球板的发球

前言 本文将实现当游戏开始时球在球板上,且不具备物理性,在Windows平台上通过点击屏幕来球发射,安卓平台上当手指触摸到屏幕上时进行发球,并此时开始具备物理性。 发球逻辑 首先在球板上创建一个球的发射点,新建一个空的游戏物体,并命名为BallPoint,并将其作为SpringBoa…

012 rocketmq事务消息

文章目录 事务消息概念介绍交互流程事务消息原理TransactionListener接⼝TransactionProducer.javaTransactionConsumer.java 事务消息 内置topic中的消息对消费者不可见 本地事务mq消息事务消息 消息队列 RocketMQ 版提供的分布式事务消息适⽤于所有对数据最终⼀致性有强需求…

SpringBoot原理-02.自动配置-概述

一.自动配置 所谓自动配置&#xff0c;就是Spring容器启动后&#xff0c;一些配置类、bean对象就自动存入了IOC容器当中&#xff0c;而不需要我们手动声明&#xff0c;直接从IOC容器中引入即可。省去了繁琐的配置操作。 我们可以首先将spring项目启动起来&#xff0c;里面有一…

知识图谱+智能问诊预诊系统vue+django+neo4j架构、带问诊历史

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; &#x1f90d;编号&#xff1a;D032 &#x1f90d;智能问答&#xff1a;智能问答自诊、预诊功能&#xff0c;同时可以保存问答历史 &…

DeepSeek 助力 Vue3 开发:打造丝滑的悬浮按钮(Floating Action Button)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Java数据结构_一篇文章了解常用排序_8.1

本文所有排序举例均默认为升序排列。 目录 1. 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想&#xff1a; 2.1.2 直接插入排序 2.1.3 希尔排序&#xff08;缩小增量排序&#xff09; 2.2 选择排序 2.2.1 基本思想&#xff1a; 2.2.2 直接选择排…

(南京观海微电子)——倍压设计与应用

在电路设计过程中&#xff0c;当后级需要的电压比前级高出数倍而所需要的电流并不是很大时&#xff0c;就可以使用倍压整流电路。倍压整流&#xff1a;可以将较低的交流电压&#xff0c;用耐压较高的整流二极管和电容器&#xff0c;“整”出一个较高的直流电压。 01 倍压整流电…

网络安全-使用DeepSeek来获取sqlmap的攻击payload

文章目录 概述DeepSeek使用创建示例数据库创建API测试sqlmap部分日志参考 概述 今天来使用DeepSeek做安全测试&#xff0c;看看在有思路的情况下实现的快不快。 DeepSeek使用 我有一个思路&#xff0c;想要测试sqlmap工具如何dump数据库的&#xff1a; 连接mysql数据库&#…

【含文档+PPT+源码】基于SpringBoot+Vue医药知识学习与分享平台的设计与实现

项目介绍 本课程演示的是一款 基于SpringBootVue医药知识学习与分享平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署…

coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以

coze生成的工作流&#xff0c;发布后&#xff0c;利用cmd命令行执行。可以定时发日报&#xff0c;周报等。让他总结你飞书里面的表格。都可以。 很简单。 准备工作&#xff0c;先发布你的工作流&#xff0c;和发布应用。 然后&#xff0c;点击扣子API 。 申请一个&#xff0…

【Python】基础语法三

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解Python的函数、列表和数组。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff…

使用 Spring Boot 和 Keycloak 的 OAuth2 快速指南

1. 概述 本教程是关于使用 Spring Boot 和 Keycloak 通过 OAuth2 配置后端的。 我们将使用 Keycloak 作为 OpenID 提供程序。我们可以将其视为负责身份验证和用户数据&#xff08;角色、配置文件、联系信息等&#xff09;的用户服务。它是最完整的 OpenID Connect &#xff0…

第三十六:6.6. 【$refs、$parent】

概述&#xff1a; $refs用于 &#xff1a;父→子。 $parent用于&#xff1a;子→父。 // 向外部提供数据 defineExpose({house}) 原理如下&#xff1a; 属性说明$refs值为对象&#xff0c;包含所有被ref属性标识的DOM元素或组件实例。$parent值为对象&#xff0c;当前组件…

【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f4da;欢迎订阅专栏…

【开源免费】基于SpringBoot+Vue.JS网络海鲜市场系统(JAVA毕业设计)

本文项目编号 T 222 &#xff0c;文末自助获取源码 \color{red}{T222&#xff0c;文末自助获取源码} T222&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Go中slice和map引用传递误区

背景 关于slice和map是指传递还是引用传递&#xff0c;很多文章都分析得模棱两可&#xff0c;其实在Go中只有值传递&#xff0c;但是很多情况下是因为分不清slice和map的底层实现&#xff0c;所以导致很多人在这一块产生疑惑&#xff0c;下面通过代码案例分析slice和map到底是…

C++ ++++++++++

初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时&#xff0c;必须要指定出相应的数据类型&#xff0c;否则无法给变量分配内存 整型 sizeof关键字 浮点型&#xff08;实型&#xff09; 有效位数保留七位&#xff0c;带小数点。 这个是保…

【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发-第1章 GPIO基础知识

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

探秘《矩阵之美》:解锁矩阵的无限魅力

在这个数据驱动的时代&#xff0c;矩阵作为数学中的瑰宝&#xff0c;不仅在理论研究中占据核心地位&#xff0c;更在工程技术、计算机科学、物理学、经济学等众多领域发挥着不可替代的作用。今天&#xff0c;让我们通过中科院大学耿修瑞老师&#xff08;中科院空天信息研究院研…

进行性核上性麻痹患者的生活护理指南

进行性核上性麻痹是一种神经系统退行性疾病&#xff0c;合理的生活护理能有效改善症状&#xff0c;提高生活质量。 居家环境要安全。移除地面杂物&#xff0c;铺设防滑垫&#xff0c;安装扶手&#xff0c;降低跌倒风险。在浴室、厨房等湿滑区域要特别加强防护措施。建议在床边、…