苹果视觉 - 条形码检测无法处理颜色不同的条形码

5

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

传统的线性和CCD条形码扫描器可以很好地识别它们,我没有遇到任何问题。我尝试使用苹果视觉框架,但它不能识别这些条形码。在白色背景上的黑色条形码上它能够完美运行。

我的条形码都是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”滤镜不起作用。
编辑:这些是条形码:

enter image description here

enter image description here


3
你能否在问题中添加一张带有样本条形码的图片,以便我们测试是否无法检测到? - Paulw11
1
@curiously77 在这里你可以像这样提到 我的条形码都是 Code 128,所以我使用这个代码 - 所以 接受不同颜色的条形码 意味着我认为你需要使用所有支持的符号 - https://developer.apple.com/documentation/vision/vndetectbarcodesrequest/2879281-supportedsymbologies - Ram
1个回答

5

理论

默认情况下,苹果的Vision、CoreML、ARKit和RealityKit框架被设计为检测必须通过相机看到的条形码作为高对比度黑白图像(具有通道的可预测权重:r=30%g=59%b=11%)。在您的情况下,黄色条形码在白色背景上具有最低的对比度,因此没有真正的条形码扫描器可以读取它,包括用于Vision的RGB相机源。

让我们看看条形码标签颜色的优缺点文章告诉我们的:

条形码难以扫描的原因之一是颜色,或更具体地说,颜色的对比度不足。如果背景与条纹颜色之间没有足够的对比度,条形码扫描器将很难读取它


避免使用以下颜色组合,因为它们处于低对比度灰度范围内

enter image description here


实际解决方案

(仅当条形码在平面表面上使用漫反射涂料打印时)

虽然如果您想要使用Vision成功检测色彩条形码和色彩背景,您绝对需要在Vision开始识别条形码之前,将颜色CVPixelBuffer流应用于灰度滤镜。为此,请使用AVFoundationCoreImage框架。

请阅读以下三篇文章,了解如何执行此操作:

P.S.

金属漆

用金属漆(金色、银色、铜等)印刷的条形码是条形码阅读器最糟糕的实例。这是因为金属漆会捕捉到反射和环境光的高光。因此,用金属漆印刷的条形码几乎无法读取。


1
我一定会尝试的。 - curiously77
1
如果你看一下我在问题中上传的条形码,那么具有银色背景的(金色)条形码就被识别了。 - curiously77
1
我明白了。您的图像展示了最糟糕的情况 - 金属漆在圆柱形表面上。依我看,您无法改善这种类型条形码的读取过程。事实上,透明的薄膜还会造成反光,让情况更加复杂! - Andy Jazz
1
我知道。App Store和Play Store上有几个应用程序能够在不同的光线环境下完美识别条形码。因此,我认为我可以基于Vision框架或Core ML开发一个解决方案。 - curiously77
1
只有当您的条形码使用漫反射油漆(非金属油漆)印刷在平面表面上(不是粗糙的、圆柱形的),并且没有被耀光膜覆盖时,才能改善iOS Vision应用程序的阅读过程。虽然条形码扫描器(而不是手机)可以读取这样的条形码... - Andy Jazz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接