从版本 2.4.4 开始,OpenCV 包含桌面 Java 绑定。
获取它的最简单方法是从 OpenCV SourceForge 存储库下载版本 2.4.4 或更高版本的相应软件包。
注意
Windows 用户可以在包内的文件夹中找到 Java 开发所需的预构建文件。对于其他操作系统,需要从源代码构建 OpenCV。opencv/build/java/
获取 OpenCV 源代码的另一种选择是克隆 OpenCV git 存储库。为了使用 Java 绑定构建 OpenCV,您需要安装 JDK(Java 开发工具包)(我们推荐 Oracle/Sun JDK 6 或 7)、Apache Ant 和 Python v2.6 或更高版本。
让我们构建 OpenCV:
生成 Makefile 或 MS Visual Studio* 解决方案,或用于在系统中构建可执行文件的任何内容:
或
注意
当 OpenCV 构建为一组静态库(-DBUILD_SHARED_LIBS=OFF 选项)时,Java 绑定动态库就足够了,即不依赖于其他 OpenCV 库,而是包含所有 OpenCV 代码。
检查 CMake 的输出,并确保 java 是“要构建”的模块之一。如果没有,则可能是缺少依赖项。您应该通过查看 CMake 输出中查找未找到的任何与 Java 相关的工具并安装它们来进行故障排除。
注意
如果 CMake 在系统中找不到 Java,请在运行之前将 JAVA_HOME 环境变量设置为已安装 JDK 的路径。例如:
现在开始构建:
或
除此之外,还将创建一个包含 Java 接口 () 的 jar 和一个包含 Java 绑定和所有 OpenCV 内容(或分别)的本机动态库。我们稍后会用到这些文件。bin/opencv-244.jar
lib/libopencv_java244.so
bin/Release/opencv_java244.dll
注意
所描述的示例随文件夹中的 OpenCV 库一起提供。opencv/samples/java/ant
build.xml
<项目名称=“SimpleSample” basedir=“.” 默认值=“重建-运行”><属性名称=“src.dir” 值=“src”/><属性名称=“lib.dir” 值=“${ocvJarDir}”/><路径 id=“类路径” ><文件集 dir=“${lib.dir}” 包括=“**/*.jar”/>路径><属性名称=“build.dir” 值=“build”/><属性名称=“classes.dir” 值=“${build.dir}/classes”/><属性名称=“jar.dir” 值=“${build.dir}/jar”/><属性名称=“主类” 值=“${ant.project.name}”/><目标名称=“clean”><删除 dir=“${build.dir}”/>目标><目标名称=“编译”><mkdir dir=“${classes.dir}”/><javac includeantruntime=“false” srcdir=“${src.dir}” destdir=“${classes.dir}” classpathref=“类路径”/>目标><目标名称=“jar” depends=“compile”><mkdir dir=“${jar.dir}”/>destfile =“${jar.dir}/${ant.project.name}.jar” basedir=“${classes.dir}” ><清单><属性名称=“主类” 值=“${主类}”/>清单>罐>目标><目标名称=“运行” depends=“jar”><java fork=“true” 类名=“${main-class}”><sysproperty 键=“java.library.path” path=“${ocvLibDir}”/><类路径><路径 refid=“类路径”/><路径位置=“${jar.dir}/${ant.project.name}.jar”/>类路径>爪哇岛>目标><目标名称=“重建” depends=“clean,jar”/><目标名称=“rebuild-run” depends=“clean,run”/>项目>
注意
此 XML 文件可以重用于构建其他 Java 应用程序。它描述了第 3 - 12 行中的通用文件夹结构以及用于编译和运行应用程序的通用目标。重用此 XML 时,不要忘记修改第 1 行中的项目名称,这也是主类的名称(第 14 行)。OpenCV jar 和 jni lib 的路径应作为参数(第 5 行中的“${ocvJarDir}”和第 37 行中的“${ocvLibDir}”),但为方便起见,您可以对这些路径进行硬编码。有关其构建文件格式的详细说明,请参阅 Ant 文档。
src
build.xml
SimpleSample.java
SimpleSample.java
导入 org.opencv.core.Core;导入 org.opencv.core.Mat;导入 org.opencv.core.CvType;导入 org.opencv.core.Scalar;类 简单示例 {static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME);公共静态无效main(String[] args) {System.out.println(“欢迎使用 OpenCV ” + Core.VERSION);垫子 m = 新垫子(5, 10, CvType.CV_8UC1, 新标量(0));System.out.println(“OpenCV 垫子:” + m);垫子 mr1 = m.row(1);mr1.setTo(新标量(1));垫子 mc5 = m.col(5);mc5.setTo(新标量(5));System.out.println(“OpenCV 垫数据:\n” + m.dump());}}
在控制台中包含以下内容的文件夹中运行以下命令:build.xml
例如:
该命令应启动 [re]build 并运行示例。您应该在屏幕上看到如下内容:
现在,我们将使用 SBT 创建一个简单的 Java 应用程序。这是对不熟悉此构建工具的人的简要介绍。我们之所以使用 SBT,是因为它特别简单和强大。
首先,按照 SBT 网站上的说明下载并安装 SBT。
接下来,导航到您希望应用程序源所在的新目录(在目录外部)。我们称它为“JavaSample”,并为它创建一个目录:opencv
现在,我们将创建必要的文件夹和一个 SBT 项目:
现在在您喜欢的编辑器中打开并粘贴以下内容。它定义了您的项目:project/build.scala
导入sbt._导入Keys._对象 JavaSampleBuild 扩展 Build {def scalaSettings = Seq(scalaVersion := “2.10.0”,scalacOptions ++= Seq(“-优化”,“-未选中”,“-弃用”))def buildSettings =Project.defaultSettings ++scala设置惰性值根 = {val settings = buildSettings ++ Seq(name := “JavaSample”)Project(id = “JavaSample”, base = file(“.”), settings = settings)}}
现在编辑并粘贴以下内容。这将启用 Eclipse 项目的自动生成:project/plugins.sbt
现在从根目录运行 sbt,然后从 SBT 中运行 eclipse 以生成一个 eclipse 项目:JavaSample
您应该看到如下内容:
现在,您可以使用 Import ... -> Existing projects into workspace 将 SBT 项目导入 Eclipse。对于指南来说,是否真的这样做是可选的;我们将使用 SBT 来构建项目,因此如果您选择使用 Eclipse,它将仅用作文本编辑器。
要测试一切是否正常,请创建一个简单的“Hello OpenCV”应用程序。为此,请创建一个包含以下内容的文件:src/main/java/HelloOpenCV.java
公共类 HelloOpenCV {公共静态无效main(String[] args) {System.out.println(“你好,OpenCV”);}}
现在从 sbt 控制台执行 run,或者更简洁地说,从命令行运行 sbt run:
您应该看到如下内容:
现在,我们将使用 OpenCV 创建一个简单的人脸检测应用程序。
首先,创建一个文件夹并将 OpenCV jar 复制到其中。缺省情况下,SBT 会将 lib 文件夹中的 jar 添加到 Java 库搜索路径中。您可以选择重新运行 sbt eclipse 来更新 Eclipse 项目。lib/
接下来,创建目录并将此 Lena 映像下载到其中:src/main/resources
确保它被称为 .resources 目录中的项在运行时可供 Java 应用程序使用。"lena.png"
接下来,从以下目录复制:lbpcascade_frontalface.xml
opencv/data/lbpcascades/
resources
现在修改 src/main/java/HelloOpenCV.java,使其包含以下 Java 代码:
导入 org.opencv.core.Core;导入 org.opencv.core.Mat;导入 org.opencv.core.MatOfRect;导入 org.opencv.core.Point;导入 org.opencv.core.Rect;导入 org.opencv.core.Scalar;导入 org.opencv.imgcodecs.Imgcodecs;导入 org.opencv.objdetect.CascadeClassifier;//检测图像中的人脸,在人脸周围绘制方框,并写入结果更改为“faceDetection.png”。//类 检测脸演示 {公共无效运行() {System.out.println(“\n正在运行 DetectFaceDemo”);从资源中的级联文件创建人脸检测器目录。CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource(“/lbpcascade_frontalface.xml”).getPath());垫子图像 = Imgcodecs.imread(getClass().getResource(“/lena.png”).getPath());检测图像中的人脸。MatOfRect 是 Rect 的一个特殊容器类。MatOfRect faceDetections = 新 MatOfRect();faceDetector.detectMultiScale(图像, faceDetections);System.out.println(String.format(“检测到 %s 人脸”, 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));}保存可视化检测。字符串文件名 = “faceDetection.png”;System.out.println(String.format(“写入 %s”,文件名));Imgcodecs.imwrite(文件名,图像);}}公共类 HelloOpenCV {公共静态无效main(String[] args) {System.out.println(“你好,OpenCV”);加载本机库。System.loadLibrary(Core.NATIVE_LIBRARY_NAME);新增功能检测FaceDemo().run();}}
请注意对 System.loadLibrary(Core.NATIVE_LIBRARY_NAME) 的调用。在使用任何本机 OpenCV 方法之前,必须为每个 Java 进程执行一次此命令。如果不调用它,则会收到 UnsatisfiedLink 错误。如果在 OpenCV 已经加载时尝试加载它,您也会收到错误。
现在使用“sbt run”运行人脸检测应用程序:
您应该看到如下内容:
它还应该将下图写入:faceDetection.png