点击上方
“
小白学视觉
”,选择加"
星标
"或“
置顶
”
重磅干货,第一时间送达

综述
2012年iOS应用商店中发布了一个名为FuelMate的Gas跟踪应用。
小伙伴们可以使用该应用程序跟踪汽油行驶里程,以及有一些有趣的功能,例如Apple Watch应用程序、
vin.li集成以及基于趋势mpg的视觉效果。
燃料伴侣
对此我们有一个新想法,该如何添加一个功能帮助我们在泵中扫描燃油,并在应用程序中输入燃油信息?让我们深入研究如何实现这一目标。
技术
对于这个项目的我们首先应该编写一个简单的Python应用程序以拍摄汽油泵的图像,然后尝试从中读取数字。
OpenCV
是用于计算机视觉应用程序的流行的跨平台库。它包括各种图像处理实用程序以及某些机器学习功能。除此之外我们希望可以先使用Python对其进行原型设计,然后将处理代码转换为C ++以在iOS应用程序上运行。
目标
我们首先要考虑以下两个问题:
1.
我们可以从图像中分离出数字吗?
2.
我们可以确定图像代表哪个数字吗?
数字分割
如何确定图像中的数字有多种方法,但是我提出了使用简单的
图像阈值法
来尝试查找数字的方法。
图像阈值化的基本思想是将图像转换为灰度,然后说灰度值小于某个常数的任何像素,则该像素为一个值,否则为另一个。最后,您得到的二进制图像只有两种颜色,在大多数情况下只是黑白图像。
这个概念在OCR应用中非常有效,但是主要问题是决定对该阈值使用什么。我们可以选择一些常量,也可以使用OpenCV选择其他一些选项。我们可以使用自适应阈值而不是使用常数,这将使用图像的较小部分并确定要使用的不同阈值。这在具有不同照明情况的应用中特别有用,特别是在扫描气泵中。
将图像设置为阈值后,可以使用OpenCV的
findContours
方法查找图像中连接了白色像素部分的区域。绘制轮廓后,便可以裁剪出这些区域并确定它们是否可能是数字以及它是什么数字。
基本图像处理流程
这是我在测试图像处理中使用的原始图像。它有一些眩光点,但是图像相当干净。让我们逐步完成获取此源图像的过程,并尝试将其分解为单个数字。
原始图片
影像准备
在开始图像处理流程之前,我们决定先调整一些图像属性,然后再继续。这有点试验和错误,但注意到,当我们调整图像的曝光度时,可以获得更好的结果。下面是使用Python调整后的图像,相当于曝光(阿尔法)的图像
cv::Mat::convertTo
这是刚刚在图像垫乘法操作
cv2.multiply(some_img, np.array([some_alpha])
,
调整曝光
灰阶
将图像转换为灰度。
转换为灰度
模糊
模糊图像以减少噪点。我们尝试了许多不同的模糊选项,但仅用轻微的模糊就找到了最佳结果。
稍微模糊
阈值图像转换为黑白图像
在下图中,使用
cv2.adaptiveThreshold
带有
cv2.ADAPTIVE_THRES_GAUSSIAN_C
选项的方法。此方法采用两个参数,块大小和要调整的常数。确定这两者需要一些试验和错误,更多有关优化部分的内容。
阈值为黑/白
填补空白
由于大多数燃油泵都使用某种7段LCD显示屏,因此数字中存在一些细微的间隙,无法使用轮廓绘制方法,因此我们需要使这些段看起来相连。在这种情况下,我们将转到
erode
图像来弥补这些差距。由于大家可能希望使用,所以这似乎向后看,
dilate
但是这些方法通常适用于图像的白色部分。在我们的案例中,我们正在“侵蚀”白色背景以使数字看起来更大。
侵蚀出来的数字
反转图像
在尝试在图像中查找轮廓之前,我们需要反转颜色,因为该
findContours
方法将找到白色的连接部分,而当前的数字是黑色。
颜色反转
在图像上找到轮廓
下图显示了我们的原始图像,该图像在上图的每个轮廓上都有包围框。大家可以看到它找到了数字,但也找到了一堆不是数字的东西,因此我们需要将它们过滤掉。
红色框显示所有找到的轮廓
轮廓过滤
1.
现在我们有了许多轮廓,我们需要找出我们关心的轮廓。浏览了一堆气泵的显示和场景后,使用一套适用于轮廓的快速规则。
2.