所以,我必须扫描不同颜色的不同条形码。例如,黑底黄色条形码或白底黄色条形码。
我对传统线性和 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”过滤器不起作用。
编辑:这些是条形码:
Theory
默认情况下,Apple Vision、CoreML、ARKit 和 RealityKit 框架旨在检测必须通过相机才能看到的条形码high-contrast black-and-white
图像(具有可预测的通道权重:r=30%
, g=59%
, b=11%
)。在您的情况下,白色背景上的黄色条形码具有最低对比度,因此没有任何真正的条形码扫描仪可以读取它,包括 Vision 的 RGB 相机输入。
让我们看看有什么条码标签的最佳和最差颜色 https://consolidatedlabel.com/label-articles/colors-for-barcode-labels文章告诉我们:
条形码难以扫描的原因之一是color
,或更具体地说,缺乏颜色对比度。如果背景和条形颜色之间没有足够的对比度,条码扫描仪将很难读取它.
避免使用以下颜色的组合,因为它们属于低对比度灰度幽灵:
实用的解决方案
(仅当条形码使用漫反射涂料打印在平面上时)
尽管如果您想使用 Vision 成功检测彩色背景上的彩色条形码,您肯定需要对颜色应用灰度滤镜CVPixelBuffer在 Vision 开始识别条形码之前进行流传输。对于此用途AVFoundation
and CoreImage
构架。
请阅读这三篇文章,了解如何做到这一点:
- 将过滤器应用于捕获流 https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/avcamfilter_applying_filters_to_a_capture_stream
- 将图像转换为 CVPixelBuffer 以进行机器学习 Swift https://stackoverflow.com/questions/44400741/convert-image-to-cvpixelbuffer-for-machine-learning-swift
- 将彩色图像转换为灰度图像 https://developer.apple.com/documentation/accelerate/converting_color_images_to_grayscale
P.S.
金属漆
用金属涂料(金、银、铜等)印刷的条形码对于条形码读取器来说是最糟糕的情况。这是因为金属涂料会产生反射,并且具有环境光的镜面反射。因此,用金属涂料打印的条形码几乎无法读取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)