智能图像处理平台:图像处理配置类
- 游戏开发
- 2025-09-20 03:39:01

这里我们先修改一下依赖,不用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; } } }智能图像处理平台:图像处理配置类由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“智能图像处理平台:图像处理配置类”
上一篇
6.6.6嵌入式SQL
下一篇
React底层原理详解