跳至主要內容

图像处理,还是使用javacv库方便,更加成熟

程序员李某某原创javaopencvjavacv大约 3 分钟

图像处理,还是使用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,运行效果

简单的执行了把二维码增加背景图片上的功能。

背景图片:

background-02.png
background-02.png

增加完成之后的效果:

imgOut.jpg
imgOut.jpg

6,总结

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

上次编辑于:
贡献者: ext.liyuanhao3,liyuanhao,李元昊