《Java图像处理:基于OpenCV与JVM》 ——1 基于JavaVM的OpenCV

举报
华章计算机 发表于 2020/02/20 19:22:50 2020/02/20
【摘要】 本节书摘来自华章计算机《Java图像处理:基于OpenCV与JVM》 —— 书中第1章,第1.1节,作者是[法] 尼古拉斯·莫德奇克(Nicolas Modrzyk) ,魏 兰 潘婉琼 译 。

第1章

基于JavaVM的OpenCV

几年前,在去上海的旅途中,一位好友送给我一本很厚的书,是介绍OpenCV的。书中包含了海量的图像处理方法、实时视频分析例子和引人入胜的深度解析,于是我迫不及待地配置好环境来测试书中的程序。

众所周知,OpenCV是开源计算机视觉(Open Source Computer Vision)的英文简写。作为一个开源库,OpenCV提供可直接使用的高级图像处理算法,既包括简单易用的高级图像操作,也包括形状识别以及实时视频监测和分析功能。

OpenCV中最核心的内容是多维矩阵对象,叫作Mat。通过本书的学习,Mat将成为我们最熟悉的朋友。在许多攻略中,输入的对象是Mat,处理的内容是Mat,输出的结果也是Mat。

虽然Mat即将成为我们的好朋友,但是作为一个C++对象,它并不是很好相处。你必须重新编译、安装和小心地配置任何使用Mat的新环境。

但是Mat可以被打包。

Mat虽然在本地运行,但它可以被神不知鬼不觉地加载到Java虚拟机中运行。

第1章将通过介绍Java虚拟机中的多种语言让你开始上手使用OpenCV,当然包括Java语言,也包括通俗易懂的Scala语言和谷歌最爱的Kotlin语言。

为了使用同样的方法来运行不同的语言,你会首先(重新)认识一种Java编译工具,叫作Leiningen,之后利用它来运行简单的OpenCV函数。

第1章是第2章的入门基础。第2章的内容是相似的基于JVM的Clojure语言,可以为富有创造性的OpenCV代码带来即时的视觉反馈。

1.1 初识Leiningen

  问题定义

有一句名言是“一次编写,随处运行”,也就是说,在不同的机器上,可以用同样简单便捷的方法来编译和运行Java程序。当然,你总是可以使用最原始的javac命令来编译Java代码,然后使用单纯的Java在命令行中运行编译过的代码,但现在已经是21世纪了,我们应该寻找更有效的方法。

无论使用何种编程语言,手动配置工作环境都是一项大工程。而且当你完成配置之后,很难与他人分享胜利果实。

使用编译工具,可以用简单的方法定义项目所需的依赖,同时也可帮助其他用户更快地上手。

接下来,我们介绍一个简单易用的编译工具。

  解决方法

Leiningen 是(主要)面向JavaVM的编译工具。它与一些知名的工具有些相似,例如Ant、Maven和Gradle。

当Leiningen命令行安装完成之后,就可以基于模板来创建JavaVM项目,并且毫无顾虑地运行程序了。

本攻略将介绍如何快速安装Leiningen,以及如何使用它运行你的第一个Java程序。

  工作原理

首先,把Leiningen安装在你需要的地方,然后用它来创建一个空的Java项目。

注意 安装Leiningen之前,需要在你的电脑上安装Java 8。由于Java 9通过破坏现有方法来解决旧的问题,我们目前还是选择使用Java 8。

安装Leiningen

Leiningen的网站主页是https://leiningen.org/。

在主页上方,可以找到手动安装Leiningen的四个简单步骤。

在MacOS和Unix环境中:

1.下载lein脚本。https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein

2.把它放在你的$PATH变量中,以便shell可以找到它(例如~/bin)。

3.设置脚本为可运行(chmod a+x ~/bin/lein)。

4.在终端运行lein,然后它会下载一个安装包。

在Windows环境中:

1.下载lein.bat批处理脚本。https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein.bat

2.用管理员权限把它放在你的C:/Windows/System32文件夹下。

3.打开命令提示符运行lein,然后它会下载一个安装包。

在Unix环境中,你可以使用包管理器。在MacOS中,Brew有Leiningen的包。

在Windows中,也有一个很好的安装器在https://djpowell.github.io/leiningen-win-installer/。

如果你是一个Chocolatey粉丝,Windows也有Chocolatey的包:https://chocolatey.org/packages/Lein。

如果你在终端或命令提示符中安装成功,那么你就可以看到已安装工具的版本号。在第一次运行的时候,Leiningen会下载它的内部依赖(internal dependecy),但是之后的运行通常会非常快。

 image.png

用Leiningen创建新的包含OpenCV的Java项目

Leiningen通常使用一个文本文件,叫作project.clj,里面有一个简单的图,存储着元数据(metadata)、依赖(dependencies)、插件(plug-ins)和配置(settings)。

当你通过调用lein命令来运行项目时,lein会去project.clj文件中查找该项目的相关信息。

Leiningen自带可直接使用的项目模板,但是为了更好地理解,我们来一步步地学习第一个例子。

对于一个Leiningen Java项目,你需要两个文件:

一个用来描述项目的project.clj文件

一个包含Java代码的.java文件,例如Hello.java

第一个项目的目录结构看起来是这个样子的:

 image.png

一个目录,两个文件。

为了简化问题,第一个Java例子十分简单。

 image.png

接下来,让我们来看一看project.clj文件中的细节:

 image.png

这其实是Clojure代码,不过我们把它看作一种领域专用语言(Domain Specific Language,DSL),即使用特定术语描述项目的语言。

为了方便,每种术语在表1-1中有解释。

表1-1 Leiningen项目元数据

image.png

image.png

 

接下来,请创建对应的文件夹和文件目录,复制并粘贴每个文件对应的内容。

完成之后,就可以运行你的第一个Leiningen命令:

 image.png

这个命令会根据你的环境,在你的终端或控制台中生成以下内容:

 image.png

太棒啦!我们的旅程开始啦!但是,等一等,刚才到底发生了什么呢?

其中包含了一点魔法。Leiningen的run命令会让Leiningen运行一个编译过的Java类main函数。这个被运行的类定义在项目的元数据中,你应该记得,叫作Hello。

在运行Java类之前,我们需要先编译它。默认情况下,Leiningen会在运行run之前进行编译,这也解释了“Compiling...”是从哪里来的。

之后,你可能会注意到,在你的项目中创建了一个叫作target的文件夹,里面包含了一个叫作classes的文件夹和一个Hello.class文件。

 image.png

target和classes文件夹是编译过的Java字节码(bytecode)的默认存储地址,这个target文件夹之后会被加入Java运行时的类路径(classpath)。

紧跟着是“lein run”触发的执行阶段,Hello类的主函数中的代码块被执行,并输出信息。

image.png

你可能会问:“如果我有多个Java文件,并且想运行非主函数之外的其他函数呢?”

这是一个非常合理的问题,在第1章中编写和运行不同代码时,你会经常使用这个技巧。

假如你在同样的Java文件夹中写了第二个Java类,叫作Hello2.Java,其中包含更新的旅途内容。

 image.png

为了运行Hello2.java的主函数,在调用lein run时,需要加上-m选项,这里m代表着主函数,之后跟着需要运行的Java类的名称。

 image.png

这个命令输出以下内容:

 image.png

太好啦!根据这些指导,你可以勇往直前,运行你的第一个OpenCV Java程序了。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。