当前位置: 首页 > 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;}}
}

http://www.lryc.cn/news/545125.html

相关文章:

  • 【图文详解】什么是微服务?什么是SpringCloud?
  • 基于ssm的校园跑腿管理系统+vue
  • 5个GitHub热点开源项目!!
  • docker通用技术介绍
  • #渗透测试#批量漏洞挖掘#某图创图书馆集群管理系统updOpuserPw SQL注入(CVE-2021-44321)
  • 智能合约安全 | 合约无效化攻击
  • RabbitMQ 的介绍与使用
  • 【手撕算法】K-Means聚类全解析:从数学推导到图像分割实战
  • 【SQL技术】不同数据库引擎 SQL 优化方案剖析
  • RabbitMQ系列(二)基本概念之Publisher
  • OAK相机的抗震性测试
  • 2025最新Nginx高频面试题
  • 【Kubernetes】API server 限流 之 maxinflight.go
  • 推荐算法工程师的技术图谱和学习路径
  • Milvus高性能向量数据库与大模型结合
  • 轮式机器人在复杂地形中如何选择合适的全局路径规划算法?
  • Metal学习笔记九:光照基础
  • 【字符串】最长公共前缀 最长回文子串
  • Linux提权之详细总结版(完结)
  • week 3 - More on Collections - Lecture 3
  • Pwntools 的详细介绍、安装指南、配置说明
  • PLC(电力载波通信)网络机制介绍
  • Qt监控系统远程回放/录像文件远程下载/录像文件打上水印/批量多线程极速下载
  • 自学微信小程序的第八天
  • 【java】@Transactional导致@DS注解切换数据源失效
  • 003 SpringBoot集成Kafka操作
  • Android SystemUI开发(一)
  • C#贪心算法
  • Vue程序下载
  • 【UCB CS 61B SP24】Lecture 17 - Data Structures 3: B-Trees学习笔记