Как определить штрих-код из изображения в Swift?

Я пытаюсь обнаружить штрих-код на выбранном пользователем изображении. Я могу обнаружить QR-код с изображения, но не могу найти ничего, связанного со сканированием штрих-кода с изображения. Код, который я использую для обнаружения QR-кода на изображении, выглядит следующим образом:

func detectQRCode(_ image: UIImage?) -> [CIFeature]? {
        if let image = image, let ciImage = CIImage.init(image: image){
            var options: [String: Any]
            let context = CIContext()
            options = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
            let qrDetector = CIDetector(ofType: CIDetectorTypeQRCode, context: context, options: options)
            if ciImage.properties.keys.contains((kCGImagePropertyOrientation as String)){
                options = [CIDetectorImageOrientation: ciImage.properties[(kCGImagePropertyOrientation as String)] ?? 1]
            }else {
                options = [CIDetectorImageOrientation: 1]
            }
            let features = qrDetector?.features(in: ciImage, options: options)
            return features

        }
        return nil
    }

Когда я захожу в документацию CIDetectorTypeQRCode, там написано

/* Specifies a detector type for barcode detection. */
@available(iOS 8.0, *)
public let CIDetectorTypeQRCode: String

Хотя это QR-код, в документации говорится, что он также может обнаруживать штрих-код. Отлично. Но когда я использую ту же функцию для декодирования штрих-кода, она возвращает мне пустой массив функций. Даже если он вернет мне некоторые функции, как я смогу преобразовать его в альтернативу штрих-кода CIQRCodeFeature? Я не вижу альтернативы штрих-коду в документации CIQRCodeFeature. Я знаю, что это можно сделать с помощью ZBar SDK, но я стараюсь не использовать здесь сторонние библиотеки, или это обязательно для использования в этом отношении??.

Пожалуйста, помогите, большое спасибо.


person Anuran Barman    schedule 18.08.2019    source источник
comment
Так что третья сторона - единственное решение, которое я думаю. Хорошо. Тогда я буду использовать MLKit из Firebase. Спасибо   -  person Anuran Barman    schedule 18.08.2019
comment
Выполните поиск по VNDetectBarcodesRequest.   -  person rmaddy    schedule 18.08.2019
comment
Попробуйте это stackoverflow.com/a/57285925/5084797   -  person manishsharma93    schedule 18.08.2019
comment
@manishsharma93 Это работает для живого видео с камеры, а не для статического изображения.   -  person rmaddy    schedule 18.08.2019
comment
Я не могу сказать, насколько я прав @AnuranBarman, но вы можете видеть, что базовый CIRectangleFeature поддерживается. Вам нужно будет написать собственную оболочку для обнаружения штрих-кода. Кажется, довольно интересное упражнение ^^   -  person jms    schedule 18.08.2019


Ответы (1)


Вы можете использовать VisionFramework

Код запроса обнаружения штрих-кода

var vnBarCodeDetectionRequest : VNDetectBarcodesRequest{
        let request = VNDetectBarcodesRequest { (request,error) in
            if let error = error as NSError? {
                print("Error in detecting - \(error)")
                return
            }
            else {
                guard let observations = request.results as? [VNDetectedObjectObservation]
                    else {
                        return
                }
                print("Observations are \(observations)")
            }
        }
        return request
    }

Функция, в которую нужно передать изображение.

func createVisionRequest(image: UIImage)
    {
        guard let cgImage = image.cgImage else {
            return
        }
        let requestHandler = VNImageRequestHandler(cgImage: cgImage, orientation: image.cgImageOrientation, options: [:])
        let vnRequests = [vnBarCodeDetectionRequest]
        DispatchQueue.global(qos: .background).async {
            do{
                try requestHandler.perform(vnRequests)
            }catch let error as NSError {
                print("Error in performing Image request: \(error)")
            }
        } 
    }

Справочная ссылка

person Priya Talreja    schedule 18.08.2019
comment
Интересный. Спасибо за ссылку. дополнительные знания. Я уже сделал эту работу с помощью Firebase MLKit. Хотя спасибо за ответ - person Anuran Barman; 19.08.2019