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

embedded/2025/3/3 5:42:13/

这里我们先修改一下依赖,不用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>

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

java">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;}}
}


http://www.ppmy.cn/embedded/169538.html

相关文章

SSH密码更改

Windows User目录下的.ssh/config&#xff0c;全部删除 linux 在主用户文件夹&#xff0c;ctrlh显示隐藏文件。删除.shh文件夹内所有文件。

2025机械考研复试面试问题汇总篇(含13门科目),考研机械复试专业面试常见重点问题总结!考研机械复试专业面试准备看这一篇就够了!

前言——25机械考研复试专业面试问题汇总 机械复试超全流程攻略 机械复试看这一个专栏就够用了!机械复试调剂英语自我介绍口语专业面试常见问题总结 机械保研面试-CSDN博客https://blog.csdn.net/weixin_56510835/article/details/143101233 本专栏包含的所有文章内容,可以看…

《Effective Objecti-C 2.0》第二章阅读笔记

小蓝书学习 第二章&#xff1a;对象&#xff0c;消息&#xff0c;运行期前言第六条&#xff1a;理解“属性”这一概念属性特质原子性atomicnonatimic 读写权限内存管理语义方法名 第七条&#xff1a;在对象内部进来直接访问变量实例第八条&#xff1a;理解“对象等同性”这一概…

如何配置HTTP代理及SOCKS代理的工作原理

目录 一、HTTP代理的配置与应用 二、SOCKS代理的工作原理与应用 三、HTTP代理与SOCKS代理的比较 四、总结 在探讨如何配置HTTP代理以及SOCKS代理的工作原理时&#xff0c;我们将通过简洁的语言、具体的代码示例和实际案例&#xff0c;为您呈现一个清晰、易懂的理解框架。 …

Ruby基础

一、字符串 定义 283.to_s //转为string "something#{a}" //定义字符串&#xff0c;并且插入a变量的值 something//单引号定义变量 %q(aaaaaaaaa) // 定义字符串&#xff0c;&#xff08;&#xff09;内可以是任何数&#xff0c;自动转义双引号%Q("aaaaa"…

记录一次MQTT慢订阅优化

场景&#xff1a;收不到设备数据&#xff0c;MQTT监控&#xff0c;发现真实数据确实没有&#xff0c;监听2个小时&#xff0c;获取大量慢订阅信息 优化方式 通配符匹配加速​ 优化订阅主题匹配算法&#xff0c;实现多级哈希索引结构。例如将home//status拆分为固定层级匹配&am…

南京来可电子CAN总线数据记录仪在汽车售后服务站的应用

南京来可电子CAN总线数据记录仪在汽车售后服务站的应用 南京来可电子&#xff08;LaiCore&#xff09;作为国内领先的车载数据采集设备供应商&#xff0c;其CAN总线数据记录仪凭借高精度、多协议兼容性及智能化功能&#xff0c;在汽车售后服务站中发挥重要作用。以下是其核心应…

微服务学习(5):消息转换器由JDK序列化——JSON序列化

在企业应用中&#xff0c;将消息转换器从JDK序列化改为JSON序列化提升了系统间通信的效率与安全性。JSON作为轻量级数据交换格式&#xff0c;增强了跨平台兼容性&#xff0c;简化了开发与维护。相比JDK序列化&#xff0c;JSON序列化减少了潜在的安全风险&#xff0c;提供了更紧…