Apple Vision - обнаружение штрих-кода не работает для штрих-кодов с разными цветами - PullRequest
4 голосов
/ 06 марта 2020

Итак, я должен сканировать различные штрих-коды с разными цветами. Например, желтый штрих-код на черном фоне или желтый штрих-код на белом фоне.

У меня нет проблем с их распознаванием традиционными линейными и ПЗС-сканерами штрих-кода. Я пытался использовать Apple Vision Framework, но он не работает на них. Они отлично работают на черных штрих-кодах с белым фоном.

Все мои штрих-коды имеют код 128, поэтому я использую этот код для него:

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

for barcode in barcodes {

    if let detectedBarcode = barcode as? VNBarcodeObservation {

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

И в функции captureOutput в AVCaptureVideoDataOutputSampleBufferDelegate, я используйте это, чтобы отфильтровать мою прямую трансляцию как черно-белую, что поможет в распознавании золотого штрих-кода на серебряном фоне (первое изображение):

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

1 Ответ

3 голосов
/ 18 марта 2020

Немного теории:

По умолчанию платформы Apple Vision и CoreML предназначены для обнаружения штрих-кодов, которые должны просматриваться через камеру в виде high-contrast black-and-white изображений (с предсказуемым веса для каналов: r=30%, g=59%, b=11%). В вашем случае желтый штрих-код на белом фоне имеет наименьшую контрастность , поэтому ни один настоящий сканер штрих-кода не может его прочитать, включая канал RGB для Vision.

Давайте посмотрим, что Лучшие и худшие цвета для этикеток со штрих-кодом статья рассказывает нам:

Одной из причин, по которой штрих-коды могут быть трудно сканировать, является color, или, более конкретно, отсутствие контраста в цветах , Если не хватает контрастности между цветом фона и штрих-кода, сканерам штрих-кода будет трудно его прочитать .


Избегайте следующие комбинации цветов, потому что они находятся в низкоконтрастном оттенке серого :

enter image description here


Практическое решение:

(только если штриховой код был напечатан на плоской поверхности диффузной краской)

Хотя, если вы хотите успешно обнаружить штрих-код chromati c на фоне chromati c с помощью Vision, вам определенно нужно чтобы применить фильтр оттенков серого для цветного потока CVPixelBuffer , прежде чем Vision начнет распознавать штрих-коды. Для этого используйте AVFoundation и CoreImage фреймворки.

Пожалуйста, прочитайте эти три поста, чтобы узнать, как вы можете это сделать:

PS

Metalli c Краски:

Штрих-коды, напечатанные красками metali c (золото, серебро, медь и др. c), являются худшими случаями для считывателей штрих-кодов. Это связано с тем, что краска metalli c улавливает отражения и имеет блики от окружающего света. Таким образом, штрих-коды, напечатанные красками * * * * * * *, едва читаются.

...