当前位置: 首页 > news >正文

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

这里我们先修改一下依赖,不用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 {@Autowiredprivate MinioConfig minioConfig;public static ImageOperationTool imageOperationTool;private static String PATH = ClassUtils.getDefaultClassLoader().getResource("openCV/opencv_java460.dll").getPath();static {System.load(PATH);}@PostConstructpublic 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);// 上传到 MinIOreturn 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;}}
}

相关文章:

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

这里我们先修改一下依赖&#xff0c;不用JavaCV&#xff0c;用openCV。 导入依赖&#xff1a; <!-- JavaCV 依赖&#xff0c;用于图像和视频处理 --> <!-- <dependency>--> <!-- <groupId>org.bytedeco</groupId>--> &l…...

【图文详解】什么是微服务?什么是SpringCloud?

目录 一.认识微服务架构 ??微服务带来的挑战 二.微服务解决方案SpringCloud ??SpringCloud的版本 ??SpringCloud和SpringBoot的关系 ??SpringCloud实现方案 Spring Cloud Netfix Spring Cloud Alibaba ??Spring Cloud 实现对比 在入门Spring Cloud 之前&…...

基于ssm的校园跑腿管理系统+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统共有管理员、用户两个角色 管理员主要的功能用户信息管理、任务信息管理、任务类型管理、接单信息管理、公告信息管理、投诉信息管理、公告类型管…...

5个GitHub热点开源项目!!

1.自托管 Moonlight 游戏串流服务&#xff1a;Sunshine 主语言&#xff1a;C&#xff0c;Star&#xff1a;14.4k&#xff0c;周增长&#xff1a;500 这是一个自托管的 Moonlight 游戏串流服务器端项目&#xff0c;支持所有 Moonlight 客户端。用户可以在自己电脑上搭建一个游戏…...

docker通用技术介绍

docker通用技术介绍 1.docker介绍 1.1 基本概念 docker是一个开源的容器化平台&#xff0c;用于快速构建、打包、部署和运行应用程序。它通过容器化技术将应用及其依赖环境&#xff08;如代码、库、系统工具等&#xff09;打包成一个标准化、轻量级的独立单元&#xff0c;实…...

#渗透测试#批量漏洞挖掘#某图创图书馆集群管理系统updOpuserPw SQL注入(CVE-2021-44321)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

智能合约安全 | 合约无效化攻击

目录&#xff1a; 智能合约安全 合约无效化攻击 合约自毁函数 selfdestruct 攻击实现 漏洞防御 总结 智能合约安全 合约无效化攻击 合约无效化攻击类同于web安全中的逻辑漏洞中的一种 我们这里拿一个典型的例子来讲解 有这样一份智能合约, 每个人可以向其中发送1 eth 第七个…...

RabbitMQ 的介绍与使用

一. 简介 1> 什么是MQ 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已。 其主要用途&#xff1a;不同进程Process/线程T…...

【手撕算法】K-Means聚类全解析:从数学推导到图像分割实战

摘要 聚类算法是探索数据内在结构的利器&#xff01;本文手撕K-Means核心公式&#xff0c;结合Python代码实现与图像分割案例&#xff0c;详解&#xff1a; ✅ 欧氏距离计算 ✅ 簇中心迭代更新 ✅ 肘部法则优化 目录 摘要 目录 一、算法核心思想 二、数学原理详解 2.1 …...

【SQL技术】不同数据库引擎 SQL 优化方案剖析

一、引言 在数据处理和分析的世界里&#xff0c;SQL 是不可或缺的工具。不同的数据库系统&#xff0c;如 MySQL、PostgreSQL&#xff08;PG&#xff09;、Doris 和 Hive&#xff0c;在架构和性能特点上存在差异&#xff0c;因此针对它们的 SQL 优化策略也各有不同。这些数据库…...

RabbitMQ系列(二)基本概念之Publisher

在 RabbitMQ 中&#xff0c;Publisher&#xff08;发布者&#xff09; 是负责向 RabbitMQ 服务器发送消息的客户端角色&#xff0c;通常被称为“生产者”。以下是其核心功能与工作机制的详细解析&#xff1a; 一、核心定义与作用 消息发送者 Publisher 将消息发送到 RabbitMQ 的…...

OAK相机的抗震性测试

在工业环境中&#xff0c;双目视觉相机必须具备与工作环境同等的坚固性。鉴于部分客户会将我们的相机应用于恶劣环境&#xff08;例如安装在重型机械上&#xff09;&#xff0c;我们依据EN 60068-2-6:2008标准对相机进行了振动耐受性测试。 测试涉及的相机型号包括&#xff1a…...

2025最新Nginx高频面试题

2025最新Nginx高频面试题 摘要&#xff1a;本文整理了2025年企业高频Nginx面试题&#xff0c;覆盖核心原理、配置优化、安全防护及云原生场景实战&#xff0c;助你轻松应对技术面试&#xff01; 核心原理篇 1. Nginx的Master-Worker架构优势是什么&#xff1f; 答案&#xf…...

【Kubernetes】API server 限流 之 maxinflight.go

这个文件实现了一个基于信号量(Channel)的简单限流器。 基础知识 总共有四种channel 带缓冲的channel nonMutatingChan、mutatingChan 都是带缓冲的channel &#xff0c;这类channel 的特点是&#xff1a; 这允许最多 mutatingLimit /nonMutatingLimit 个请求同时获取令牌并执…...

推荐算法工程师的技术图谱和学习路径

推荐算法工程师的技术图谱和学习路径可以从多个维度进行概述,可以总结如下: 一、技术图谱 推荐算法工程师需要掌握的技术栈主要分为以下几个方面: 数学基础: 微积分、线性代数、概率论与统计学是推荐算法的基础,用于理解模型的数学原理和优化算法。高等数学、最优化理论…...

Milvus高性能向量数据库与大模型结合

Milvus | 高性能向量数据库&#xff0c;为规模而构建Milvus 是一个为 GenAI 应用构建的开源向量数据库。使用 pip 安装&#xff0c;执行高速搜索&#xff0c;并扩展到数十亿个向量。https://milvus.io/zh Milvus 是什么&#xff1f; Milvus 是一种高性能、高扩展性的向量数据…...

轮式机器人在复杂地形中如何选择合适的全局路径规划算法?

已思考完成 收起 嗯&#xff0c;用户问的是轮式机器人在复杂地形中如何选择合适的全局路径规划算法。首先&#xff0c;我需要理解复杂地形可能带来的挑战&#xff0c;比如崎岖的路面、动态障碍物、非结构化环境等等。轮式机器人在这里的运动控制需要考虑地形通过性、稳定性&…...

Metal学习笔记九:光照基础

光和阴影是使场景流行的重要要求。通过一些着色器艺术&#xff0c;您可以突出重要的对象、描述天气和一天中的时间并设置场景的气氛。即使您的场景由卡通对象组成&#xff0c;如果您没有正确地照亮它们&#xff0c;场景也会变得平淡无奇。 最简单的光照方法之一是 Phong 反射模…...

【字符串】最长公共前缀 最长回文子串

文章目录 14. 最长公共前缀解题思路&#xff1a;模拟5. 最长回文子串解题思路一&#xff1a;动态规划解题思路二&#xff1a;中心扩散法 14. 最长公共前缀 14. 最长公共前缀 ​ 编写一个函数来查找字符串数组中的最长公共前缀。 ​ 如果不存在公共前缀&#xff0c;返回空字符…...

Linux提权之详细总结版(完结)

这里是我写了折磨多提权的指令的总结 我这里毫无保留分享给大家哦 首先神魔是提权 我们完整的渗透测试的流程是(个人总结的) 首先提升权限是我们拿到webshell之后的事情,如何拿到webshell,怎末才能拿到webshell,朋友们等我更新,持续更新中,下一篇更新的是windows提权 好了 废…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能

vxe-table vue 表格复选框多选数据&#xff0c;实现快捷键 Shift 批量选择功能 查看官网&#xff1a;https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...