OpenCV介绍:Java&Android——Java 开发简介 OpenCV v4.8.0

上一个教程图像观察:在 Visual Studio 调试器中查看内存图像

下一个教程在 Eclipse 中使用 OpenCV Java

原作者Eric Christiansen and Andrey Pavlenko
兼容性OpenCV >= 3.0

警告
本教程可能包含过时信息。

自 OpenCV 2.4.4 起,OpenCV 支持桌面 Java 开发,使用与 Android 开发几乎相同的界面。本指南将帮助您使用 OpenCV 创建第一个 Java(或 Scala)应用程序。我们将使用 Apache AntSimple Build Tool (SBT) 来构建应用程序。

如果您想使用 Eclipse,请访问 Using OpenCV Java with Eclipse。本指南之后的进一步阅读,请参阅 Android 开发入门教程

本指南的内容

在本指南中,我们将

  • 获取支持桌面 Java 的 OpenCV
  • 创建一个 Ant 或 SBT 项目
  • 用 Java 或 Scala 编写一个简单的 OpenCV 应用程序

在 OpenCV 资源库的 samples/java 文件夹中创建示例时使用了相同的过程,因此如果您迷失了方向,请参考这些文件。

获取合适的 OpenCV

从 2.4.4 版开始,OpenCV 包含桌面 Java 绑定。

下载

最简单的方法是从 OpenCV SourceForge 软件库中下载 2.4.4 或更高版本的相应软件包。

注意
Windows 用户可在软件包内的 opencv/build/java/ 文件夹中找到 Java
开发所需的预构建文件。对于其他操作系统,则需要从源代码中构建 OpenCV。

另一种获取 OpenCV 源文件的方法是克隆 OpenCV git 仓库。要使用 Java 绑定构建 OpenCV,需要安装 JDK(Java Development Kit,Java 开发包)(我们推荐 Oracle/Sun JDK 6 或 7)、Apache Ant 和 Python v2.6 或更高版本。

构建

让我们构建 OpenCV:

git clone git://github.com/opencv/opencv.git
cd opencv
git checkout 2.4
mkdir build
cd build

生成 Makefile 或 MS Visual Studio* 解决方案,或任何你在系统中用来构建可执行文件的文件:

cmake -DBUILD_SHARED_LIBS=OFF .

cmake -DBUILD_SHARED_LIBS=OFF -G "Visual Studio 10" ...

注意
当 OpenCV 作为一组静态库(-DBUILD_SHARED_LIBS=OFF 选项)构建时,Java
绑定动态库是全功能的,即不依赖于其他 OpenCV 库,而是包含内部的所有 OpenCV代码。

检查 CMake 的输出,确保 java 是 "待构建 "模块之一。如果不是,很可能是缺少了一个依赖项。您应通过 CMake 输出查找任何未找到的 Java 相关工具并安装它们,从而排除故障。
在这里插入图片描述

注意
如果 CMake 无法在系统中找到 Java,请在运行 CMake 前将 JAVA_HOME 环境变量设置为 JDK 的安装路径。例如
export JAVA_HOME=/usr/lib/jvm/java-6-oracle
cmake -DBUILD_SHARED_LIBS=OFF ...

现在开始构建

make -j8

msbuild /m OpenCV.sln /t:Build /p:Configuration=Release /v:m

此外,这将创建一个包含 Java 界面的 jar(bin/opencv-244.jar)和一个包含 Java 绑定和所有 OpenCV 内容的本地动态库(分别为 lib/libopencv_java244.sobin/Release/opencv_java244.dll)。我们稍后将使用这些文件。

使用 Ant 的 Java 示例

注意
所述示例随 OpenCV 库一起提供,位于 opencv/samples/java/ant 文件夹中。

  • 创建一个用于开发此示例应用程序的文件夹。
  • 在该文件夹中,使用任何文本编辑器创建包含以下内容的 build.xml 文件:
<project name="SimpleSample" basedir="." default="rebuild-run">
    <property name="src.dir"     value="src"/>
    <property name="lib.dir"     value="${ocvJarDir}"/>
    <path id="classpath">
        <fileset dir="${lib.dir}" includes="**/*.jar"/>
    </path>
    <property name="build.dir"   value="build"/>
    <property name="classes.dir" value="${build.dir}/classes"/>
    <property name="jar.dir"     value="${build.dir}/jar"/>
    <property name="main-class"  value="${ant.project.name}"/>
    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>
    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac includeantruntime="false" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
    </target>
    <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
            </manifest>
        </jar>
    </target>
    <target name="run" depends="jar">
        <java fork="true" classname="${main-class}">
            <sysproperty key="java.library.path" path="${ocvLibDir}"/>
            <classpath>
                <path refid="classpath"/>
                <path location="${jar.dir}/${ant.project.name}.jar"/>
            </classpath>
        </java>
    </target>
    <target name="rebuild" depends="clean,jar"/>
    <target name="rebuild-run" depends="clean,run"/>
</project>

注意
此 XML 文件可重复用于构建其他 Java 应用程序。它描述了第 3 - 12
行中的通用文件夹结构,以及编译和运行应用程序的通用目标。重复使用此 XML 时,不要忘记修改第 1 行中的项目名称,该名称也是主类的名称(第
14 行)。OpenCV jar 和 jni lib 的路径应作为参数(第 5 行中的" o c v J a r D i r " 和第 37 行中的 " {ocvJarDir}"和第 37 行中的" ocvJarDir"和第37行中的"{ocvLibDir}"),但为方便起见,也可以硬编码这些路径。有关 Ant 生成文件格式的详细说明,请参阅 Ant 文档

  • build.xml 文件旁边创建一个 src 文件夹,并在其中创建一个 SimpleSample.java 文件。
  • 将以下 Java 代码放入 SimpleSample.java 文件:
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Scalar;
class SimpleSample {
  static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }
  public static void main(String[] args) {
    System.out.println("Welcome to OpenCV " + Core.VERSION);
    Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
    System.out.println("OpenCV Mat: " + m);
    Mat mr1 = m.row(1);
    mr1.setTo(new Scalar(1));
    Mat mc5 = m.col(5);
    mc5.setTo(new Scalar(5));
    System.out.println("OpenCV Mat data:\n" + m.dump());
  }
}
  • 在包含 build.xml 的文件夹中的控制台中运行以下命令:
ant -DocvJarDir=path/to/dir/containing/opencv-244.jar -DocvLibDir=path/to/dir/containing/opencv_java244/native/library

例如

ant -DocvJarDir=X:\opencv-2.4.4\bin -DocvLibDir=X:\opencv-2.4.4\bin\Release

该命令将启动[重新]编译并运行示例。你应该在屏幕上看到类似这样的内容:

在这里插入图片描述

Java 和 Scala 的 SBT 项目

现在,我们将使用 SBT 创建一个简单的 Java 应用程序。对于不熟悉该构建工具的人来说,这只是一个简单的介绍。我们之所以使用 SBT,是因为它特别简单且功能强大。

首先,根据 SBT 网站上的说明下载并安装 SBT。

然后,导航到一个新的目录(在 opencv 目录之外),将应用程序源代码放在该目录下。让我们称其为 “JavaSample”,并为其创建一个目录:

cd <在 opencv 以外的某个地方>mkdir JavaSample

现在我们将创建必要的文件夹和 SBT 项目:

cd JavaSample
mkdir -p src/main/java # 这是 SBT 希望找到 Java 源的地方
mkdir project # 这是构建定义所在的位置

现在用你喜欢的编辑器打开 project/build.scala,然后粘贴以下内容。它将定义你的项目:

import sbt._
import Keys._
object JavaSampleBuild extends Build {
  def scalaSettings = Seq(
    scalaVersion := "2.10.0",
    scalacOptions ++= Seq(
      "-optimize",
      "-unchecked",
      "-deprecation"
    )
  )
  def buildSettings =
    Project.defaultSettings ++
    scalaSettings
  lazy val root = {
    val settings = buildSettings ++ Seq(name := "JavaSample")
    Project(id = "JavaSample", base = file("."), settings = settings)
  }
}

现在编辑 project/plugins.sbt,并粘贴以下内容。这将启用 Eclipse 项目的自动生成:

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.0")

现在从 JavaSample 根目录运行 sbt,并在 SBT 中运行 eclipse 以生成 eclipse 项目:

sbt # 启动 sbt 控制台
eclipse # 在 sbt 控制台内运行 "eclipse

您应该会看到类似下面的内容:
在这里插入图片描述
现在可以使用 Import … -> Existing projects into workspace 将 SBT 项目导入 Eclipse。在本指南中,是否实际导入并不重要;我们将使用 SBT 来构建项目,因此如果选择使用 Eclipse,它将只是一个文本编辑器。

要测试一切是否正常,请创建一个简单的 "Hello OpenCV "应用程序。方法是创建一个 src/main/java/HelloOpenCV.java 文件,内容如下:

public class HelloOpenCV {
  public static void main(String[] args) {
    System.out.println("Hello, OpenCV");
 }

现在从 sbt 控制台执行运行,或者更简洁地说,从命令行运行 sbt run:

sbt run

你应该会看到类似下面的内容:
在这里插入图片描述

运行 SBT 示例

现在,我们将使用 OpenCV 创建一个简单的人脸检测应用程序。

首先,创建 lib/ 文件夹并将 OpenCV jar 复制到其中。默认情况下,SBT 会将 lib 文件夹中的 jar 添加到 Java 库搜索路径中。您可以选择重新运行 sbt eclipse 来更新 Eclipse 项目。

mkdir lib
cp <opencv_dir>/build/bin/opencv_<version>.jar lib/
sbt eclipse

接下来,创建 src/main/resources 目录,并将 Lena 映像下载到其中:
在这里插入图片描述
确保其名为 “lena.png”。Java 应用程序在运行时可使用资源目录中的项目。

接下来,将 lbpcascade_frontalface.xml 从 opencv/data/lbpcascades/ 复制到资源目录:

cp <opencv_dir>/data/lbpcascades/lbpcascade_frontalface.xml src/main/resources/

现在修改 src/main/java/HelloOpenCV.java,使其包含以下 Java 代码:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;
//
// 检测图像中的人脸,在人脸周围绘制方框,并将结果写入
// 将结果写入 "faceDetection.png"。
//
class DetectFaceDemo {
  public void run() {
    System.out.println("\nRunning DetectFaceDemo");
    // 从 resources 目录中的级联文件创建人脸检测器。
    // 目录中的级联文件创建一个人脸检测器。
    CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("/lbpcascade_frontalface.xml").getPath());
    Mat image = Imgcodecs.imread(getClass().getResource("/lena.png").getPath());
    // 检测图像中的面。
    // MatOfRect 是一个特殊的 Rect 容器类。
    MatOfRect faceDetections = new MatOfRect();
    faceDetector.detectMultiScale(image, faceDetections);
    System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
    // 在每个面周围绘制一个边界框。
    for (Rect rect : faceDetections.toArray()) {
        Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
    }
    // 保存可视化检测结果。
    String filename = "faceDetection.png";
    System.out.println(String.format("Writing %s", filename));
    Imgcodecs.imwrite(filename, image);
  }
}
public class HelloOpenCV {
  public static void main(String[] args) {
    System.out.println("Hello, OpenCV");
    // 加载本地库。
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    new DetectFaceDemo().run();
  }
}

注意调用 System.loadLibrary(Core.NATIVE_LIBRARY_NAME)。在使用任何 OpenCV 本地方法之前,必须在每个 Java 进程中准确执行该命令一次。如果不调用它,就会出现 UnsatisfiedLink 错误。如果在 OpenCV 已加载的情况下尝试加载它,也会出现错误。

现在使用 sbt run 运行人脸检测应用程序:

sbt run

你应该会看到如下内容:
在这里插入图片描述
它还应将以下图像写入 faceDetection.png
在这里插入图片描述
大功告成!现在您已经有了一个使用 OpenCV 的 Java 应用程序示例,可以开始自己的工作了。祝您好运,生活愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值