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

本文介绍了如何在Scala中使用OpenCV进行图像处理,包括设置Scala项目,编写OpenCV代码,实现模糊和Canny边缘检测效果。通过减少样板代码,Scala提供了更简洁的编程体验。

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

1582201943763106.png

1582201949477528.png

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

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

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

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

1582201962560102.png

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

1582201972180282.png

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

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

1582201980103161.png

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

1582201986548641.png

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

1582201995539097.png

图1-36 Scala设置

模糊

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

1582202007328553.png

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

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

1582202018892544.png

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

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

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

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

Canny效果

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

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

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

1582202039254198.png

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

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

1582202051525728.png

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

代码转载自:https://pan.quark.cn/s/8ce4326d996e 对于在 CentOS 7 系统中修改网卡配置文件后无法使设置生效的情况,经过实践验证,可以通过使用 nmcli 命令来进行调整。完成修改之后,需要重新启动虚拟机以使更改生效,这样操作流程即告完成。如果设置仍然无法生效,则表明虚拟机在启动过程中所获取的 IP 地址配置并非针对 eth0,此时可以对其它网卡的配置文件进行修改或将其移除。在 CentOS 7 系统中,网络配置的管理机制早期版本存在差异,主要体现为采用了 Network Manager 服务来负责网络接口的管理。在某些情形下,尽管修改了 `/etc/sysconfig/network-scripts` 目录下的 `ifcfg-eth0` 文件,但网络配置却未能即时生效。此类问题的发生通常源于 CentOS 7 采用了不同于以往的配置读取方法。接下来将具体阐述如何借助 nmcli 命令来处理这一挑战。 以 root 用户身份登录系统并打开终端界面。nmcli 是 Network Manager 提供的命令行界面工具,它支持在命令行环境下执行网络连接的建立、编辑、查询及管理任务。针对修改 eth0 网卡配置的需求,可以遵循以下步骤进行操作: 1. 导航至 `/etc/sysconfig/network-scripts` 目录: ``` cd /etc/sysconfig/network-scripts ``` 2. 检查该目录内是否存在 `ifcfg-eth0.bak` 文件,该备份文件可能是先前调整配置时遗留下来的,若存在可能造成冲突。若发现该文件,可以选择将其删除: ``` [root@localhost netw...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值