图像处理,还是使用javacv库方便,更加成熟
图像处理,还是使用javacv库方便,更加成熟
1,技术需求
需要对图片进行复杂的处理,而不是简单缩放叠加功能。 当然java的基础库里面有 BufferedImage 可以使用。 但是仅限基本功能。要是复杂点的都要手写。 且担心 BUG 多。
2,对几个java的库进行调研
先问下 GPT给推荐了几个:
Apache Commons Imaging (之前称为Apache Commons Sanselan): GitHub地址: https://github.com/apache/commons-imaging Star数量: 391星 1.0-alpha3 on May 19, 2022 还没有正式发布
ImageJ: GitHub地址: https://github.com/imagej/imagej Star数量: 435星 v1.54h on Dec 16, 2023
Marvin: GitHub地址: https://github.com/gabrielarchanjo/marvin-framework Star数量: 103星 12/22/2016 Marvin Framework 1.5.4 released.
imgscalr: GitHub地址: https://github.com/rkalla/imgscalr Star数量: 1.2k星 4.2-release on Jan 12, 2012
Thumbnailator: GitHub地址: https://github.com/coobird/thumbnailator Star数量: 4.9k星 June 28, 2023: Thumbnailator 0.4.20
imgscalr 和 Thumbnailator: 这两个库主要用于图像缩放和生成缩略图,可能不是直接用于图像拼接的最佳选择。
ImageJ提供了最广泛的图像处理功能,但它的学习曲线可能会更陡峭。
Marvin好像比较合适点,但是已经很多年不更新了。 上一个版本海慧寺 16年发布的。
还有一个项目就是 javacv
3,关于javacv
项目地址:https://github.com/bytedeco/javacv 7.1k 星,更新速度不错。最新版本是: JavaCV 1.5.9 on Jun 5, 2023 底层其实依赖 bytedeco/javacpp 项目。
JavaCPP 使得Java 应用可以在高效的访问本地C++方法,JavaCPP底层使用了JNI技术。
同时也直接把so 文件封装到了 lib 包里面。会动态匹配操作系统。并不需要本地安装 opencv库。
这样就方便多了。
4,项目引入 POM 即可
并不是像官网这样直接下载源代码安装!! https://docs.opencv.org/4.x/d9/d52/tutorial_java_dev_intro.html
不建议这样。效率低,而且不方便部署。
需要引入 opencv 和 java cv 两对库。一共 4个 POM依赖。
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<version>4.7.0-1.5.9</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv-platform</artifactId>
<version>4.7.0-1.5.9</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.9</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.9</version>
</dependency>
需要自己创建个 opencv文件夹,找两个图片。 代码实现:
import org.bytedeco.javacpp.Loader;
import org.bytedeco.opencv.opencv_java;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.imgcodecs.Imgcodecs;
public class OpencvDemo {
static {
try {
/**
* bytedeco 平台的jar 引入opencv_java
*/
Loader.load(opencv_java.class);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String dir = System.getProperty("user.dir");
System.out.println("Working Directory = " + dir);
String imgFile1 = dir + "/opencv/qrcode.png";
String imgBackground = dir + "/opencv/background-02.png";
String imgOut = dir + "/opencv/imgOut.jpg";
//读入图片
Mat back = Imgcodecs.imread(imgBackground); //大图片
Mat src = Imgcodecs.imread(imgFile1); //小图片
int top = 10;
int left = 300;
//选择融合的区域
Rect rect = new Rect(left,top, src.cols(),src.rows());//x,y坐标,宽,高
Mat src_new = new Mat(back, rect);
//图片融合方法2
src.copyTo(src_new);
Imgcodecs.imwrite(imgOut, back);
}
}
5,运行效果
简单的执行了把二维码增加背景图片上的功能。
背景图片:

增加完成之后的效果:

6,总结
存在部分场景需要对图片进行复杂操作处理。 这就需要使用 javacv 进行操作了,总体上感觉相关的资料比较多。 而且可以因为和python cv库类似,也可以参考 python 代码。 需要学习一段时间才可以掌握,但也不难。
