Apple Vision – 条码检测不适用于不同颜色的条码

Posted

技术标签:

【中文标题】Apple Vision – 条码检测不适用于不同颜色的条码【英文标题】:Apple Vision – Barcode Detection doesn't work for barcodes with different colours 【发布时间】:2020-06-19 13:34:42 【问题描述】:

所以,我必须扫描不同颜色的不同条形码。例如,黑色背景上的黄色条形码或白色背景上的黄色条形码。

我对它们被传统的线性和 CCD 条码扫描仪识别没有任何问题。我曾尝试使用 Apple Vision 框架,但它不适用于它们。它们在白色背景的黑色条形码上工作得非常好。

我的条形码都是 Code 128,所以我使用这个代码:

var barcodeObservations: [String : VNBarcodeObservation] = [:]

for barcode in barcodes 

    if let detectedBarcode = barcode as? VNBarcodeObservation 

        if detectedBarcode.symbology == .code128 
            barcodeObservations[detectedBarcode.payloadStringValue!] = detectedBarcode
        
    

在 AVCaptureVideoDataOutputSampleBufferDelegate 下的“captureOutput”函数中,我使用它来过滤我的实时提要为黑白,这有助于识别银色背景上的金色条码(第一张图片):

let context = CIContext(options: nil)

let currentFilter = CIFilter(name: "CIPhotoEffectMono")
currentFilter!.setValue(CIImage(cvImageBuffer: pixelBuffer), forKey: kCIInputImageKey)
let output = currentFilter!.outputImage!

context.render(output, to: pixelBuffer)

如何让 Vision Framework 检测反色条码?

“CIColorInvert”过滤器不起作用。

编辑:这些是条形码:

【问题讨论】:

您能否在您的问题中添加一张带有您无法检测到的示例条形码的图片 @curiously77 在这里你可以提到My barcodes are all Code 128 so I use this code for it - 所以to accept barcodes of different colours 意味着我认为你需要使用所有支持的符号 - developer.apple.com/documentation/vision/… 【参考方案1】:

一点理论:

默认情况下,Apple Vision 和 CoreML 框架旨在将必须通过摄像头看到的条形码检测为 high-contrast black-and-white 图像(具有可预测的通道权重:r=30%g=59%b=11%)。在您的情况下,白色背景上的黄色条形码具有最低对比度,因此没有真正的条形码扫描仪可以读取它,包括用于 Vision 的 rgb 相机馈送。

让我们看看Best and Worst Colors for Barcode Labels的文章告诉我们什么:

条形码难以扫描的一个原因是color,或者更具体地说,缺乏颜色对比。如果背景和条形颜色之间的对比度不够,条码扫描器将很难读取它

避免以下颜色的组合,因为它们处于低对比度的灰度光谱中

实际解决方案:

(仅当条形码用漫反射漆打印在平面上时)

尽管如果您想使用 Vision 成功检测彩色背景上的彩色条码,您肯定需要在 Vision 开始识别条码之前应用灰度过滤器为 CVPixelBuffer 流着色.为此使用 AVFoundationCoreImage 框架。

请阅读这三篇文章,了解如何做到这一点:

Applying Filters to a Capture Stream Convert Image to CVPixelBuffer for Machine Learning Swift Converting Color Images to Grayscale

附言

金属漆:

用金属涂料(金、银、铜等)印刷的条形码是条形码阅读器最糟糕的情况。这是因为金属漆会捕捉反射并且它具有环境光的镜面反射。所以用金属漆打印的条形码几乎看不懂。

【讨论】:

我一定会试一试的。 如果您查看我在我的问题中上传的条形码,可以识别带有银色背景的条形码(金色)。 我明白了。您的图像显示了最糟糕的情况——圆柱表面上的金属漆。恕我直言,您无法改进此类条形码的读取过程。透明薄膜的眩光使情况变得复杂! 我知道。 App Store 和 Play Store 上的一些应用程序能够在不同的照明环境下完美识别条形码。因此,我认为我可以开发基于 Vision 框架或 Core ML 的解决方案。 只有当您的条形码使用漫反射涂料(非金属)打印时,如果它打印在平面表面(非粗糙,非圆柱形)上,您可以改进 ios Vision 应用程序的读取过程,如果它没有被眩光膜覆盖。虽然条码扫描仪(不是手机)可以读取这样的条码......

以上是关于Apple Vision – 条码检测不适用于不同颜色的条码的主要内容,如果未能解决你的问题,请参考以下文章

条码扫描不适用于视觉 API

Android Vision Api - 条码检测如何获取条码类型?

如何仅在 CGRect 中使用 Apple Vision 检测条形码?

Apple Vision Framework:通过观察检测微笑或幸福的面孔?

MLkit 人脸检测不适用于 android 的前置摄像头

在 Apple 的 Vision 框架中,我如何判断哪些语言可用于文本识别?