《Java图像处理:基于OpenCV与JVM》 ——1.14 用Scala写OpenCV代码
1.14 用Scala写OpenCV代码
问题定义
既然你已经可以使用Java写一些OpenCV代码了,并且开始享受它,但此刻你想要使用Scala来减少样板代码。
解决方法
到目前为止,你使用的当前OpenCV设置可以很容易运行任何为JavaVM编译的类。因此,如果你能够编译Scala类,并且正好有Leiningen插件,那么剩下的工作就十分相似了。
那意味着通过到目前为止已经使用的Leiningen设置,你仅需要更新project.clj文件中的项目元数据,该文件存放于几个地方来确保运行正常。
该工作需要两步。第一步,添加Scala编译器和库;第二步,更新目录,使Scala代码文件可以被找到。
工作原理
基本设置
project.clj文件需要在如下重点陈述的几个地方被更新。
项目名称,当然那是可选的。
主类,你可以使用同样的名称,但如果那样做,确保使用lein clean命令删除旧的Java代码。
接下来添加lein-zinc插件,这是一个集多能于一体的Leiningen插件。
lein-zinc插件需要在lein执行编译前触发,因此我们需要在项目元数据中的prep-tasks键中添加一步。prep-tasks键负责定义在相似命令执行前需执行的任务。
最后,将Scala库依赖加入到依赖键中。
更新的project.clj文件如下。
你为Scala建立的新项目文件结构应该看上去如图1-35所示。
就像你看到的,同Java设置相比没有太大改变,但是需确保你的源文件现在是在scala文件夹中。
为了确保所有的文件都在正确的位置且设置正确,让我们再一次尝试一个简单的OpenCV例子,但这一次使用Scala。
你将像在前面Java示例中做的一样,加载OpenCV本地库。如果你在scala对象定义中的任何地方都会调用loadLibrary,它将被JVM当作静态调用,并且在加载使用Scala最新写的SimpleOpenCV类时加载库。
其余的代码更像是Java代码的直译。
当编译上述代码时,Scala源代码会在目标文件夹中生成一些Java字节码,就像Java代码生成的方式一样。
因此,你可以像在Java中做的一样来运行Scala代码,或者通过命令行运行:
在屏幕上,控制台输出预期的OpenCV的3x3矩阵。
图1-36展示了Scala更新设置元素的全景图。
图1-36 Scala设置
模糊
第一个Scala示例的确显得有点太简单了,那么现在让我们在Scala中试试OpenCV的模糊效果。
就像你看到的,模糊效果在一行中被连续调用多次,可以在同一个矩阵对象上增加模糊效果。
图1-37中这只无聊猫咪被模糊成了图1-38中的模糊无聊猫咪。
图1-37 无聊的猫咪 图1-38 模糊后的无聊猫咪
你一定已经在本地机器上尝试了,并且发现Scala设置中两件十分友好的事情。
编译时间缩短了一些,并且实际上可以更快地看到你的OpenCV代码执行。Scala编译器似乎通过增量代码变化确定需要的编译步骤。
此外,尽管静态导入在Java中已存在,但在Scala中它似乎集成得更加自然。
Canny效果
在更多地减少样板代码的尝试中,Scala使导入类和方法变得更简单。
Scala攻略中第三个示例将展示在改变加载的OpenCV矩阵的颜色空间后,如何使用Canny变换。
下面的代码十分整洁,唯一不足的部分是OpenCV的vconcat函数需要java.util.Array并且无法使用本地Scala对象作为参数,因此你将需要使用名为Arrays.asList的Java函数来替代。
代码中使用了Canny参数以在这个简单的艺术空间中输出一些结果,但这一次并没有很有效地找出边缘。图1-39和图1-40展示了在加载的猫咪图像上使用Canny效果处理前/处理后的结果。
为Java编写的画轮廓示例也被引入到Scala中并且提供了源码,位于本书提供的案例源码库中。现在,这个示例留给读者作为一个简单的练习题。
图1-39 不害怕Scala 图1-40 我被警告了
- 点赞
- 收藏
- 关注作者
评论(0)