苹果的WWDC 2020(线上版)炸裂开幕。惊喜很多(延伸阅读:Apple’s own silicon chips for Macs),包括SwiftUI,ARKit,PencilKit,Create ML以及Core ML。但对我来说,其中最突出的还是计算机视觉处理。
苹果的Vision框架得到了更完善的支援,推出了一系列令人兴奋的新API,以相当简单直接的方式执行复杂且关键的计算机视觉算法。
从iOS14开始,Vision framwork开始支持手势和身体姿势估计、光流、轨迹检测和轮廓检测。
虽然我们将在以后的某个时间深入了解这些问题,但现在,让我们更深入地研究一个特别有趣的附加功能:轮廓检测Vision请求。
我们的目标
- 理解Vision的轮廓检测请求。
- 在一个iOS 14 SwiftUI应用程序中运行它来检测硬币的轮廓。
- 利用Core Image过滤器在将图像传递到Vision请求之前对图像进行预处理,从而简化轮廓。为了减少纹理噪声,我们将对图像进行遮罩。
Vision轮廓检测
轮廓检测识别图像中物体边缘的轮廓。本质上,它连接所有具有相同颜色或强度的连续点。
此计算机视觉任务对于形状分析、边缘检测非常有用,并且在需要在图像中找到类似类型的物体时非常有用。
硬币检测和分割是OpenCV中一个相当常见的用例,现在通过使用Vision的新VNDetectContoursRequest,我们可以在iOS应用程序中轻松地执行相同的操作(不需要第三方库)。
为了处理图像或帧,Vision框架需要一个VNRequest,它被传递到图像请求处理器或连续请求处理器中。我们得到一个VNObservation对象。
你可以根据执行的请求类别,来决定使用哪个VNObservation子类。在我们这个例子中,我们将使用VNContoursObservation,它提供所有从图像中检测到的轮廓。
我们可以从VNContoursObservation查看以下属性:
- normalizedPath:返回标准化坐标中检测到的轮廓的路径。我们必须把它转换成UIKit坐标,我们很快就会看到怎么做。
- contourCount:Vision请求返回的检测到的轮廓的数量。
- topLevelContours:未包含在任何轮廓内的VNContours数组。
- contour(at:):使用这个方法,我们可以传递索引或者IndexPath来访问子轮廓。
- confidence:整个VNContoursObservation的置信度。
注意:使用
topLevelContours
访问子轮廓可以很方便地在最终的观测结果中修改/删除它们。
现在已经对Vision轮廓检测请求有了一个概念,让我们来看看它在iOS 14应用程序中是如何工作的。