从零开始学OpenCV:Java程序员的图像处理初体验

268 阅读1分钟

大家好,我是汪小成。

最近对图片处理比较感兴趣,就研究了一下OpenCV。在这里跟大家分享一下。

为什么选择OpenCV?

OpenCV是一个开源的计算机视觉库,在图片处理领域是一个“老前辈”,功能超级丰富。

环境准备

首先,我用Maven创建了一个新的示例项目:

mvn archetype:generate \
    -DgroupId=cn.ddcherry.opencv \
    -DartifactId=01.hello-world \
    -Dversion=1.0.0 \
    -Dpackage=cn.ddcherry.opencv \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DinteractiveMode=false

然后在pom.xml中添加JavaCV的依赖:

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.11</version>
</dependency>

opencv-platform由Bytedeco社区维护,为Java开发者提供了完整的OpenCV Java封装。包括:

  • OpenCV的Java API接口封装(基于JNI)
  • 各平台预编译的native动态库(*.dll*.so*.dylib
  • 支持常用的图像处理模块
  • 可直接用于Maven项目

使用opencv-platform的优点:

  • 开箱即用 - 内置所有平台的原生库,无需手动配置
  • 跨平台 - 一次开发,支持Windows、Linux、macOS
  • 管理简单 - 使用Maven快速引入
  • 功能完整 - 支持OpenCV所有主要模块
  • 适合打包部署 - 打包部署,无需额外配置

第一个OpenCV程序

先来看下完整代码:

package cn.ddcherry.opencv.demo;

import org.bytedeco.opencv.opencv_core.Mat;

import static org.bytedeco.opencv.global.opencv_imgcodecs.imread;
import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite;

public class Hello {
    public static void main(String[] args) {
        // 示例图片路径
        String imagePath = "input_images/flower.jpg";
        // 加载图像
        Mat image = imread(imagePath);
        // 检查图像是否成功加载
        if (image.empty()) {
            throw new RuntimeException("错误: 无法读取图像文件 '" + imagePath + "'");
        }
        // 保存图片
        boolean result = imwrite("output_images/flower_output.jpg", image);
        System.out.println(result ? "图片保存成功。" : "图片保存失败。");
    }
}

这是一个非常非常简单的OpenCV示例程序,演示了使用OpenCV读取一张图片,然后保存到另外一个文件夹下。代码保持了汪小成一贯的代码风格:结构清晰、注释完善。😁