零、前言
本书将向您展示如何在 Android 应用中使用 OpenCV,该应用可显示相机供稿,保存和共享照片,操纵颜色和边缘以及以 2D 或 3D 方式跟踪真实世界的对象。 还引入了与 OpenGL 的集成,因此您可以开始构建增强现实(AR)应用,以将虚拟 3D 场景叠加到摄像机源中的跟踪对象上。
OpenCV 是一个开放源代码,跨平台的库,为计算机视觉实验和应用提供了构建基块。 它提供了高级接口来捕获,处理和显示图像数据。 例如,它抽象出有关相机硬件和数组分配的详细信息。 OpenCV 在学术界和工业界都被广泛使用。
Android 是大多数开放源代码的移动操作系统。 对于 Java 开发人员,它提供了一个称为 Android SDK 的高级应用框架。 Android 应用具有模块化的高级接口,可以相互启动和共享数据,因此它们是模块化的。 移动性,高抽象度和数据共享是照片共享应用的良好起点,类似于我们将要构建的应用。
尽管 OpenCV 和 Android 提供了许多高级抽象(以及许多开放源代码供好奇的用户浏览),但对于新手来说,它们不一定易于使用。 建立适当的开发环境并将库的广泛功能转换为应用功能都是艰巨的任务。 这本简明的书通过强调简洁的设置,简洁的应用设计以及对每个功能用途的简单理解来帮助我们。
因为 OpenCV 的 Java 和 Android 绑定是相当新的,并且它们的文档还不成熟,所以对于此主题的书的需求特别大。 关于将 OpenCV 与 Android 的标准相机,媒体和图形 API 集成的步骤的文献很少。 当然,集成是应用开发人员工作的主要部分,因此这是本书的重点。
在我们共同的旅程结束时,您将体会到通过将 OpenCV 与其他 Android 库集成而实现的各种应用功能。 您将拥有自己的小型可重用类库,可以为将来的计算机视觉项目扩展或修改它们。 您将拥有一个开发环境和使用它的知识,并且您将能够制作更多的应用!
这本书涵盖的内容
第 1 章,“设置 OpenCV”涵盖了设置 OpenCV 和 Android 开发环境(包括 Eclipse 和 Android SDK)的步骤。
第 2 章,“使用相机帧”展示了如何将 OpenCV 集成到可以预览,捕获,保存和共享照片的 Android Java 应用中。
第 3 章,“应用图像效果”探索 OpenCV 的功能,可操纵颜色通道和像素邻域。 还介绍了 Apache Commons Math 库。 我们扩展了我们的应用,以包括通道混合过滤器,“曲线”过滤器和使边缘变暗的过滤器。
第 4 章,“识别和跟踪图像”演示了识别和跟踪已知目标(例如绘画)出现在视频供稿中时的步骤。 我们扩展我们的应用,以便它围绕任何跟踪的目标绘制轮廓。
第 5 章,“将图像跟踪与 3D 渲染相结合”通过确定目标在真实 3D 空间中的位置和旋转,改进了我们先前的跟踪技术。 我们扩展了我们的应用,以便它以与 Android 设备的真实相机相同的角度设置 OpenGL 3D 场景。 然后,我们在任何跟踪的目标上方绘制一个 3D 立方体。
第 6 章,“通过 JNI 混合 Java 和 C++”演示了如何使用 Java 本机接口(JNI)从 Java 调用 C++ 函数。 我们将一些应用的过滤器转换为 C++,以了解如何使用 OpenCV 的 C++ 接口编写高效的跨平台代码。
这本书需要什么
本书提供了有关 OpenCV 和 Android 开发环境(包括 Eclipse 和 Android SDK)的设置说明。 该软件是跨平台的,说明涵盖 Windows,Mac 和 Linux。 如果您愿意对设置步骤进行定制,则其他类似 Unix 的环境也可以使用。
您需要运行 Android 2.2(Froyo)或更高版本的移动设备,并且必须配备摄像头。 优选地,它应该有两个摄像头,前后两个。
这本书适合谁
本书非常适合那些对计算机视觉不熟悉并且喜欢通过应用开发学习的 Java 开发人员。 假定您以前有 Java 经验,但不一定具有 Android 经验。 对图像数据(例如,像素和颜色通道)的基本了解也将有所帮助。
约定
在本书中,您将找到许多可以区分不同类型信息的文本样式。 以下是这些样式的一些示例,并解释了其含义。
文本,数据库表名称,文件夹名称,文件名,文件扩展名,路径名,虚拟 URL,用户输入和 Twitter 句柄中的代码字显示如下:“它将通过 Android 的MediaStore
和Intent
类与设备上的其他应用交互。”
代码块设置如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=
"http://schemas.android.com/apk/res/android"
package="com.nummist.secondsight"
android:versionCode="1"
android:versionName="1.0">
当我们希望吸引我们注意代码块的特定部分时,相关的行或项以粗体显示:
android:label="@string/app_name"
android:screenOrientation="landscape">
<intent-filter>
任何命令行输入或输出的编写方式如下:
$ cd /etc/udev/rules.d/
$ sudo touch 51-android.rules
新术语和重要词以粗体显示。 您在屏幕上看到的字词,例如在菜单或对话框中的字样如下所示:“对于所有本机(C++)项目,应重复这些步骤,其中包括 OpenCV 示例 – 人脸检测和 OpenCV 教程 2 - 混合处理。”
注意
警告或重要提示会出现在这样的框中。
提示
提示和技巧如下所示。