OpenCV-Java 开发简介

 返回目录:OpenCV系列文章目录(持续更新中......)

上一篇:如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序

下一篇:如何将OpenCV Java 与Eclipse结合使用

警告:

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

从 OpenCV 2.4.4 开始,OpenCV 支持使用与 Android 开发几乎相同的界面进行桌面 Java 开发。本指南将帮助您使用 OpenCV 创建您的第一个 Java(或 Scala)应用程序。我们将使用 Apache Ant 或 Simple Build Tool (SBT) 来构建应用程序。
如果要使用 Eclipse,请前往将 OpenCV Java 与 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 开发工具包)(我们建议使用 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_output.png

注意

如果 CMake 在系统中找不到 Java,请在运行之前将 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 接口 (bin/opencv-244.jar) 的 jar 和一个包含 Java 绑定和所有 OpenCV 内容的原生动态库 ( lib/libopencv_java244.sobin/Release/opencv_java244.dll)。我们稍后会使用这些文件。

使用 Ant 的 Java 示例

注意

所描述的示例随文件夹opencv/samples/java/ant中的 OpenCV 库一起提供。

  • 创建一个文件夹,用于开发此示例应用程序。
  • 在此文件夹中,使用文本编辑器创建包含以下内容的文件: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 行中的“${ocvJarDir}”和第 37 行中的“${ocvLibDir}”),但为方便起见,您可以对这些路径进行硬编码。有关其构建文件格式的详细说明,请参阅 Ant 文档。

  • 在文件旁边创建一个文件夹src,并在其中创建一个文件build.xmlSimpleSample.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

    该命令应启动 [re] 生成并运行示例。您应该在屏幕上看到如下内容:

    ant_output.png

适用于 Java 和 Scala 的 SBT 项目

现在,我们将使用SBT创建一个简单的Java应用程序。这是对那些不熟悉此构建工具的人的简要介绍。我们之所以使用SBT,是因为它特别简单和强大。
首先,按照其网站上的说明下载并安装SBT。
接下来,导航到希望应用程序源所在的新目录(目录opencv外部)。我们将其命名为“JavaSample”,并为其创建一个目录:

cd <somewhere outside opencv>
mkdir JavaSample

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

cd JavaSample
mkdir -p src/main/java # This is where SBT expects to find Java sources
mkdir project # This is where the build definitions live

现在在您喜欢的编辑器中打开 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 # Starts the sbt console
eclipse # Running "eclipse" from within the sbt console

您应该看到如下内容:

sbt_eclipse.png

现在,您可以使用 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 控制台执行 run,或者更简洁地说,从命令行运行 sbt run:

sbt run

您应该看到如下内容:

sbt_run.png

运行 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

确保它"lena.png"被调用 .resources 目录中的项在运行时可供 Java 应用程序使用。

接下来,从把文件lbpcascade_frontalface.xml中复制到opencv/data/lbpcascades/资源目录:Next, copy lbpcascade_frontalface.xml from opencv/data/lbpcascades/ into

现在修改 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;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
class DetectFaceDemo {
public void run() {
System.out.println("\nRunning DetectFaceDemo");
// Create a face detector from the cascade file in the resources
// directory.
CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("/lbpcascade_frontalface.xml").getPath());
Mat image = Imgcodecs.imread(getClass().getResource("/lena.png").getPath());
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
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));
}
// Save the visualized detection.
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");
// Load the native library.
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
new DetectFaceDemo().run();
}
}

注意:对 System.loadLibrary(Core.NATIVE_LIBRARY_NAME) 的调用。在使用任何本机 OpenCV 方法之前,必须对每个 Java 进程执行一次此命令。如果不调用它,则会收到 UnsatisfiedLink 错误。如果您尝试在已加载 OpenCV 的情况下加载它,您也会收到错误。

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

sbt run

您应该看到如下内容:

sbt_run_face.png

它还应该将以下faceDetection.png图像写入:

faceDetection.png

大功告成!现在,您已经拥有了一个使用 OpenCV 的示例 Java 应用程序,因此您可以自己开始工作。祝您好运,多年快乐生活!


参考文献:

1.《Introduction to Java Development》-Eric Christiansen and Andrey Pavlenko

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/278178.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prompt Engineering(提示工程)

Prompt 工程简介 在近年来&#xff0c;大模型&#xff08;Large Model&#xff09;如GPT、BERT等在自然语言处理领域取得了巨大的成功。这些模型通过海量数据的训练&#xff0c;具备了强大的语言理解和生成能力。然而&#xff0c;要想充分发挥这些大模型的潜力&#xff0c;仅仅…

口腔管理平台 |基于springboot框架+ Mysql+Java+B/S结构的口腔管理平台 设计与实现(可运行源码+数据库+lw文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 会员功能 系统功能设计 数据库E-R图设计 lunwen参考…

【Flink SQL】Flink SQL 基础概念(四):SQL 的时间属性

《Flink SQL 基础概念》系列&#xff0c;共包含以下 5 篇文章&#xff1a; Flink SQL 基础概念&#xff08;一&#xff09;&#xff1a;SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念&#xff08;二&#xff09;&#xff1a;数据类型Flink SQL 基础概念&am…

操作系统(AndroidIOS)图像绘图的基本原理

屏幕显示图像的过程 我们知道&#xff0c;屏幕是由一个个物理显示单元组成&#xff0c;每一个单元我们可以称之为一个物理像素点&#xff0c;而每一个像素点可以发出多种颜色。 而图像&#xff0c;就是在不同的物理像素点上显示不同的颜色构成的。 像素点的颜色 像素的颜色是…

【PyTorch】成功解决TypeError: iteration over a 0-d tensor

【PyTorch】成功解决TypeError: iteration over a 0-d tensor &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…

ssh 下连接Mysql 查看数据库数据表的内容的方法及步骤

要通过SSH连接到MySQL数据库&#xff0c;可以按照以下步骤进行操作&#xff1a; 在本地计算机上打开终端或命令提示符。 使用SSH命令连接到远程服务器。命令的格式如下&#xff1a; ssh usernameserver_ip其中&#xff0c;username是指在远程服务器上的用户名&#xff0c;serv…

Linux 块设备驱动

Linux 三大驱动分别是&#xff1a;字符设备驱动、块设备驱动、网络设备驱动。 块设备是针对存储设备的&#xff0c;比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动&#xff0c;块设备驱动相比字符设备驱…

jetson nano——编译一些包的网址导航,pyside2,qt(持续更新)

目录 1.PySide2下载地址2.tesserocr下载地址3.Qt下载地址4.OpenSSL官网5.latex编译器下载地址5.1MikTex5.2TeX Live 1.PySide2下载地址 https://download.qt.io/official_releases/QtForPython/pyside2/ 如下图&#xff1a; 2.tesserocr下载地址 https://github.com/simonflue…

ToolPlatform烧录HI3403实战

既然是嵌入式&#xff0c;烧录是逃不掉的。 连接串口&#xff01;必须 主机有串口&#xff0c;或者用USB转接。 软件 01.software\pc\ToolPlatform 启动 其实只有这一个选项 BurnTool面板&#xff1a; 选择配置 选择烧写eMMC&#xff0c;再点击游览&#xff0c;选择xml…

NetSuite多脚本性能研究

在项目中&#xff0c;随着复杂度的提升&#xff0c;客制脚本以及各类SuiteAPP的应用&#xff0c;导致某个对象上挂载的脚本大量增加&#xff0c;最终导致了性能问题。表现在保存单据时时间过长&#xff0c;严重影响人机界面的用户感受。基于此问题&#xff0c;我们开展了NetSui…

大语言模型RAG-langchain models (二)

大语言模型RAG-langchain models (二) 往期文章&#xff1a;大语言模型RAG-技术概览 (一) 文章目录 大语言模型RAG-langchain models (二)**往期文章&#xff1a;[大语言模型RAG-技术概览 (一)](https://blog.csdn.net/tangbiubiu/article/details/136651625)**核心模块总览Mod…

《硬件历险》之Mac抢救出现问题的时间机器硬盘中的数据

本文虽然使用“抢救”一词&#xff0c;但是运气比较好&#xff0c;远没有达到访问和修改底层的信息来抢救的地步。如果你是需要通过访问和修改底层信息来抢救数据&#xff0c;建议阅读刘伟的《数据恢复技术深度揭秘&#xff08;第二版&#xff09;》或者寻找专业人士的帮助。 《…

关于 NXP PCA85073A 实时时钟读取数据时出现 IIC 传输失败的原因解析和解决方法

一、前言 对使用 I2C 传输的 RTC 外设 PCA85073&#xff0c;在 I2C 传输过程中若有复位信号输入&#xff0c;则有概率出现 I2C 死锁的状态&#xff0c;即 SCL为高&#xff0c;SDA一直为低的现象。 二、I2C 基本协议 在分析问题出现的原因之前&#xff0c;我…

es索引操作命令

索引操作 index 创建索引 put 方法创建索引 使用 put 创建索引时必须指明文档id&#xff0c;否则报错 # PUT 创建命令 # test1 索引名称 # type1 类型名称&#xff0c;默认为_doc&#xff0c;已经被废弃 # 1 文档id PUT /test1/type1/1 {"name":"zhangsan&…

【体验有奖】用 AI 画春天,函数计算搭建 Stable Diffusion WebUI

人工智能生成内容 AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;是当下备受关注的概念之一&#xff0c;是继 PGC 和 UGC 之后的新型生产方式。AIGC 技术的核心思想是利用人工智能算法生成具有一定创意和质量的内容。例如&#xff0c;根据用户的描述或…

YOLOv9详解

1.概述 在逐层进行特征提取和空间转换的过程中&#xff0c;会损失大量信息&#xff0c;例如图中的马在建模过程中逐渐变得模糊&#xff0c;从而影响到最终的性能。YOLOv9尝试使用可编程梯度信息PGI解决这一问题。 具体来说&#xff0c; PGI包含三个部分&#xff0c;&#xff0…

AJAX 02 案例、Bootstrap框架

AJAX 学习 AJAX 2 综合案例黑马 API01 图书管理Bootstrap 官网Bootstrap 弹框图书管理-渲染列表图书管理-添加图书图书管理-删除图书图书管理 - 编辑图书 02 图片上传03 更换图片04 个人信息设置信息渲染头像修改补充知识点&#xff1a;label扩大表单的范围 AJAX 2 综合案例 黑…

【鸿蒙HarmonyOS开发笔记】自定义组件详解

自定义组件 除去系统预置的组件外&#xff0c;ArkTS 还支持自定义组件。使用自定义组件&#xff0c;可使代码的结构更加清晰&#xff0c;并且能提高代码的复用性。 我们开发的每个页面其实都可以视为自定义组件内置组件的结合 语法说明 自定义组件的语法如下图所示 各部分…

深度序列模型与自然语言处理:基于TensorFlow2实践

目录 写在前面 推荐图书 编辑推荐 内容简介 作者简介 推荐理由 写在最后 写在前面 本期博主给大家推荐一本深度学习的好书&#xff0c;对Python深度学习感兴趣的小伙伴快来看看吧&#xff01; 推荐图书 《深度序列模型与自然语言处理 基于TensorFlow2实践》 直达链接…

基于centos7的k8s最新版v1.29.2安装教程

k8s概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊语&…