- SpringBoot集成OpenCV进行图像处理
- 一、环境部署
- 二、导入依赖
- 三、使用
- 四、注意事项
- Windows
- 在OpenCV官网下载安装包
- 安装完毕后,在opencvbuildjava复制jar包,后续导入依赖时使用
- 在opencvbuildjavax64或opencvbuildjavax86复制dll文件,将dll文件复制到C:WindowsSystem32文件夹
- Linux
后续开发中… 预计本周内开发完毕
- 在SpringBoot项目的resources文件夹新建**/lib/opencv文件夹,将jar**包复制进去
- 项目不要集成spring-boot-devtools工具,会影响dll库文件导入
- 添加依赖
org
opencv
system
${project.basedir}srcmainresourceslibopencvopencv-440.jar
4.4.0
三、使用
- 新建MatUtil,将图片Base64(去掉Base64文件头)转为Mat对象
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
import sun.misc.BASE64Decoder;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class MatUtil {
public static BufferedImage base64ToBufferedImage(String base64) {
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] buffer = decoder.decodeBuffer(base64);
ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer);
return ImageIO.read(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static byte[] toByteArray(Mat mat) {
MatOfByte mob = new MatOfByte();
Imgcodecs.imencode(".jpg", mat, mob);
return mob.toArray();
}
public static BufferedImage toBufferedImage(Mat mat) throws IOException {
byte[] buffer = toByteArray(mat);
ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer);
return ImageIO.read(inputStream);
}
public static Mat base642Mat(String base64) {
return bufImg2Mat(base64ToBufferedImage(base64), BufferedImage.TYPE_3BYTE_BGR, CvType.CV_8UC3);
}
public static Mat bufImg2Mat(BufferedImage original, int imgType, int matType) {
if (original == null) {
throw new IllegalArgumentException("original == null");
}
// Don't convert if it already has correct type
if (original.getType() != imgType) {
// Create a buffered image
BufferedImage image = new BufferedImage(original.getWidth(), original.getHeight(), imgType);
// Draw the image onto the new buffer
Graphics2D g = image.createGraphics();
try {
g.setComposite(AlphaComposite.Src);
g.drawImage(original, 0, 0, null);
original = image;
} catch (Exception e) {
e.printStackTrace();
} finally {
g.dispose();
}
}
byte[] pixels = ((DataBufferByte) original.getRaster().getDataBuffer()).getData();
Mat mat = Mat.eye(original.getHeight(), original.getWidth(), matType);
mat.put(0, 0, pixels);
return mat;
}
}
- OpenCVUtil,图片处理工具类,在此工具类中编写更多图片处理方法
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import static org.opencv.highgui.HighGui.imshow;
import static org.opencv.highgui.HighGui.waitKey;
import static org.opencv.imgcodecs.Imgcodecs.imread;
import static org.opencv.imgcodecs.Imgcodecs.imwrite;
import static org.opencv.imgproc.Imgproc.*;
public class OpenCVUtil {
static {
// 解决awt报错问题
System.setProperty("java.awt.headless", "false");
System.out.println("开始加载OpenCV库...");
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
System.out.println("load success");
}
public static void imageDefinitionEnhance(String base64) {
Mat source = MatUtil.base642Mat(base64);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
GaussianBlur(source, destination, new Size(0, 0), 10);
Core.addWeighted(source, 1.5, destination, -0.5, 0, destination);
imwrite("D://hello.jpg", destination);
}
public static void test() {
Mat image = imread("C:\Users\Administrator\Desktop\bing.jpg");
if (image.empty()) {
System.out.println("image is empty");
}
imshow("Original Image", image);
// 创建输出单通道图像
Mat grayImage = new Mat(image.rows(), image.cols(), CvType.CV_8SC1);
// 进行图像色彩空间转换
cvtColor(image, grayImage, COLOR_RGB2GRAY);
imshow("Processed Image", grayImage);
imwrite("D://hello.jpg", grayImage);
waitKey();
}
}
四、注意事项
- 项目不要集成spring-boot-devtools
- 使用System.loadLibrary(Core.NATIVE_LIBRARY_NAME) 加载库,才能在部署到服务器后依旧可以动态加载库;网上的文章都是直接加载dll文件的方法
- Java使用OpenCV处理图片教程
如有建议或疑问欢迎指出!



