本节书摘来自华章出版社《Arduino计算机视觉编程》一书中的第3章,第3.1节,作者[土耳其] 欧森·奥兹卡亚(zen zkaya),吉拉伊·伊利茨(Giray Yilliki),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
第3章
用OpenCV和Arduino进行数据采集
在本章中,你将了解计算机视觉系统的数据采集部分。相机和传感器的数据都会被处理。本章将讲授如何给视觉系统选择相机和传感器以及如何正确使用它们。因此,本章有两个主要部分:一个部分是关于用OpenCV进行图像和视频采集,另外一个部分是用Arduino进行传感器数据采集。
3.1 图像和视频采集
人们通过眼睛来获取周围环境的视觉信息。当涉及机器如何获取视觉数据时,各种各样的相机被用于这个目的。因为视觉数据会用数字来表示,有效的相机处理会得到一个更好的表示。这是你可以从本章中学到的知识。
在第2章中,你已经安装了OpenCV并且运行了一个典型的hello world应用。在此基础上,我们通过手头实际案例的讲解来学习OpenCV的数据采集功能。
OpenCV支持各种各样的相机,这样开发者有很大的选择范围。学习如何针对你的应用选择一个合适的相机也是本章的一个主题。你会在本章的相机选择部分找到答案。
选择相机之后,我们将研究如何使用OpenCV进行图像和视频的采集。在此过程中,我们将会学习如何读写图像、捕捉视频等。现在让我们开始吧!
3.1.1 相机选择
相机的选择是和需求紧密相关的。所以,在开始的时候多花点时间仔细考虑你需要的系统。这个简单的步骤会在后面的开发过程中帮你节省时间和金钱。除了需求以外,相机本身的性能也是需要考虑的。所以应该联系项目需求和相机性能来做出最佳选择。这正是本节要讲的内容!
3.1.1.1 分辨率
为了给应用程序选择合适的相机,分辨率和相关的相机传感器属性非常重要,先解释一下分辨率这个术语代表的意思。
当我们谈论一台200万像素相机的时候,这是什么意思?这是指图像(或者一个视频帧)上像素的数目。如果相机产生的图片有1200像素高、1800像素宽,那么图像包括1200×1800 = 2?160?000个像素大概是两百万像素。尽管这个属性被称为相机的分辨率,但是现实中的视觉应用程序往往需要不同的信息比如物体的分辨率,它与相机分辨率紧密相关但是需要更多的细节。
在实际使用中,分辨率意味着可用来区分两点的最小距离。因为照相的目的是获取一个物体或者事件的细节,能够获取的最小细节就显得非常重要。对于视频也是一样的,它不过是一系列连续的图像。
物体分辨率这个重要术语意味着可以通过相机察觉的物体最小粒度。因此物体和最小粒度都是非常重要的。下式展示了一个特定物体的大小和可以获取的最小粒度之间的关系:
让我们举个现实生活中的例子。想象一下你正在看一辆车的车牌。假设你的相机能看到车的全景。车在全视图里面的高度和宽度都是2m。假设为了能看到车牌,你需要的最小粒度是高0.2cm、宽0.2cm。
为了理解所需的物体分辨率,我们把值代入上面的公式可以得到:
所以针对这个情况我们需要的分辨率为100万像素。但是需要注意的是这个计算依赖于物体和相机之间的距离。如果我们是从比较远的地方照相,图像中的物体会更小,因此为了识别车牌需要一个更高的分辨率。反之亦然,如果车离相机更近,那么车牌在图像中就会更大,因此一个更低分辨率的相机就能满足需求。
距离和分辨率之间的关系有一点复杂,但是可以用一种实用的方法来简化它。下图很好地展示了相机到物体的距离的重要性。
在这种情况下,我们可以很容易看出图片的宽度是车宽度的三倍,高度是车高度的两倍,所以总的分辨率是最初计算的6倍,就是600万像素,见以下计算:
你越是经常在实际例子中实践,就能越准确地猜出特定应用所需相机的分辨率。
3.1.1.2 颜色
从颜色的角度区分,相机有两种类型:单色或者彩色。选择单色相机还是彩色相机仅仅取决于应用的要求。如果应用需要彩色信息,那么必须用彩色相机。如果颜色不重要,重要的是形状,最好选择一个单色(灰度)相机。单色相机通常比彩色相机更敏感并能提供更清晰的图片。在某些情况下将这两种相机一起使用也是有可能并且是必要的。
大部分网络摄像头是彩色的。此外你可以用OpenCV从彩色相机里面捕获一个灰度图像。一般来说,考虑未来的扩展性,彩色相机是首选。通过这种方式,你可以同时获取颜色和形状信息。
3.1.1.3 帧率
帧率是用每秒的帧数(FPS)来衡量的。帧率这个术语描述了相机每秒能够捕获和传输的图像的数量。一般来说,网络摄像头最高可以达到30FPS。有一些相机允许你动态调整帧率。
帧率越高,传感器运行得更快。此外,更高的帧率也会导致更多数据的