《Java图像处理:基于OpenCV与JVM》 ——1.14 用Scala写OpenCV代码

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

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文件如下。

 image.png

image.png

你为Scala建立的新项目文件结构应该看上去如图1-35所示。

就像你看到的,同Java设置相比没有太大改变,但是需确保你的源文件现在是在scala文件夹中。

为了确保所有的文件都在正确的位置且设置正确,让我们再一次尝试一个简单的OpenCV例子,但这一次使用Scala。

你将像在前面Java示例中做的一样,加载OpenCV本地库。如果你在scala对象定义中的任何地方都会调用loadLibrary,它将被JVM当作静态调用,并且在加载使用Scala最新写的SimpleOpenCV类时加载库。

image.png

其余的代码更像是Java代码的直译。

 image.png

当编译上述代码时,Scala源代码会在目标文件夹中生成一些Java字节码,就像Java代码生成的方式一样。

因此,你可以像在Java中做的一样来运行Scala代码,或者通过命令行运行:

 image.png

在屏幕上,控制台输出预期的OpenCV的3x3矩阵。

 image.png

图1-36展示了Scala更新设置元素的全景图。

 image.png

图1-36 Scala设置

模糊

第一个Scala示例的确显得有点太简单了,那么现在让我们在Scala中试试OpenCV的模糊效果。

 image.png

就像你看到的,模糊效果在一行中被连续调用多次,可以在同一个矩阵对象上增加模糊效果。

图1-37中这只无聊猫咪被模糊成了图1-38中的模糊无聊猫咪。

            image.png

      图1-37 无聊的猫咪        图1-38 模糊后的无聊猫咪

你一定已经在本地机器上尝试了,并且发现Scala设置中两件十分友好的事情。

编译时间缩短了一些,并且实际上可以更快地看到你的OpenCV代码执行。Scala编译器似乎通过增量代码变化确定需要的编译步骤。

此外,尽管静态导入在Java中已存在,但在Scala中它似乎集成得更加自然。

Canny效果

在更多地减少样板代码的尝试中,Scala使导入类和方法变得更简单。

Scala攻略中第三个示例将展示在改变加载的OpenCV矩阵的颜色空间后,如何使用Canny变换。

下面的代码十分整洁,唯一不足的部分是OpenCV的vconcat函数需要java.util.Array并且无法使用本地Scala对象作为参数,因此你将需要使用名为Arrays.asList的Java函数来替代。

 image.png

代码中使用了Canny参数以在这个简单的艺术空间中输出一些结果,但这一次并没有很有效地找出边缘。图1-39和图1-40展示了在加载的猫咪图像上使用Canny效果处理前/处理后的结果。

为Java编写的画轮廓示例也被引入到Scala中并且提供了源码,位于本书提供的案例源码库中。现在,这个示例留给读者作为一个简单的练习题。

            image.png

      图1-39 不害怕Scala                图1-40 我被警告了


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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