《Java图像处理:基于OpenCV与JVM》 ——1 基于JavaVM的OpenCV
第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),但是之后的运行通常会非常快。
用Leiningen创建新的包含OpenCV的Java项目
Leiningen通常使用一个文本文件,叫作project.clj,里面有一个简单的图,存储着元数据(metadata)、依赖(dependencies)、插件(plug-ins)和配置(settings)。
当你通过调用lein命令来运行项目时,lein会去project.clj文件中查找该项目的相关信息。
Leiningen自带可直接使用的项目模板,但是为了更好地理解,我们来一步步地学习第一个例子。
对于一个Leiningen Java项目,你需要两个文件:
一个用来描述项目的project.clj文件
一个包含Java代码的.java文件,例如Hello.java
第一个项目的目录结构看起来是这个样子的:
一个目录,两个文件。
为了简化问题,第一个Java例子十分简单。
接下来,让我们来看一看project.clj文件中的细节:
这其实是Clojure代码,不过我们把它看作一种领域专用语言(Domain Specific Language,DSL),即使用特定术语描述项目的语言。
为了方便,每种术语在表1-1中有解释。
表1-1 Leiningen项目元数据
接下来,请创建对应的文件夹和文件目录,复制并粘贴每个文件对应的内容。
完成之后,就可以运行你的第一个Leiningen命令:
这个命令会根据你的环境,在你的终端或控制台中生成以下内容:
太棒啦!我们的旅程开始啦!但是,等一等,刚才到底发生了什么呢?
其中包含了一点魔法。Leiningen的run命令会让Leiningen运行一个编译过的Java类main函数。这个被运行的类定义在项目的元数据中,你应该记得,叫作Hello。
在运行Java类之前,我们需要先编译它。默认情况下,Leiningen会在运行run之前进行编译,这也解释了“Compiling...”是从哪里来的。
之后,你可能会注意到,在你的项目中创建了一个叫作target的文件夹,里面包含了一个叫作classes的文件夹和一个Hello.class文件。
target和classes文件夹是编译过的Java字节码(bytecode)的默认存储地址,这个target文件夹之后会被加入Java运行时的类路径(classpath)。
紧跟着是“lein run”触发的执行阶段,Hello类的主函数中的代码块被执行,并输出信息。
你可能会问:“如果我有多个Java文件,并且想运行非主函数之外的其他函数呢?”
这是一个非常合理的问题,在第1章中编写和运行不同代码时,你会经常使用这个技巧。
假如你在同样的Java文件夹中写了第二个Java类,叫作Hello2.Java,其中包含更新的旅途内容。
为了运行Hello2.java的主函数,在调用lein run时,需要加上-m选项,这里m代表着主函数,之后跟着需要运行的Java类的名称。
这个命令输出以下内容:
太好啦!根据这些指导,你可以勇往直前,运行你的第一个OpenCV Java程序了。
- 点赞
- 收藏
- 关注作者
评论(0)