智能图像处理平台:图像处理配置类
这里我们先修改一下依赖,不用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;
}
}
}