【问题标题】:Microblink: successfully reading an imageMicroblink:成功读取一张图片
【发布时间】:2021-03-16 13:33:03
【问题描述】:

我要求 Microblink 读卡器查看卡片的照片,而不是使用相机。我已经尝试过万事达卡的纵向和横向版本。这就是我声明主要变量的方式:

let blinkCardRecognizer = MBCBlinkCardRecognizer()
var recognizerList = [MBCRecognizer]()

lazy var recognizerCollection: MBCRecognizerCollection = {
    blinkCardRecognizer.extractCvv = false
    blinkCardRecognizer.extractIban = false
    blinkCardRecognizer.extractExpiryDate = false

    recognizerList.append(blinkCardRecognizer)
    return MBCRecognizerCollection(recognizers: recognizerList)
}()
lazy var recognizerRunner: MBCRecognizerRunner = {
    MBCRecognizerRunner(recognizerCollection: recognizerCollection)
}()

我已经声明了这两个代表:

MBCBlinkCardOverlayViewControllerDelegate, MBCScanningRecognizerRunnerDelegate

在我得到我的 UIImage 之后,我调用了这个函数:

func prepareToReadImage(_ theImage: UIImage?) {
    recognizerRunner.scanningRecognizerRunnerDelegate = self
    
    var image: MBCImage? = nil
    if let anImage = theImage {
        image = MBCImage(uiImage: anImage)
    }
    image?.cameraFrame = true
    image?.orientation = MBCProcessingOrientation.down
    let _serialQueue = DispatchQueue(label: "com.microblink.DirectAPI-sample-swift")
    _serialQueue.async(execute: {() -> Void in
        self.recognizerRunner.processImage(image!)
    })
}

这是我的委托回调。每次,我都会得到.empty的状态:

func recognizerRunner(_ recognizerRunner: MBCRecognizerRunner, didFinishScanningWith state: MBCRecognizerResultState) {
    if state == .valid { // values: .empty, .uncertain, .valid, .stageValid
        let result = blinkCardRecognizer.result
        
        DispatchQueue.main.async(execute: {() -> Void in
            print (result.owner)
            print (result.cardNumber)
            print (result.cardNumberPrefix)
        })
    }
}

我没有收到.valid 回复的任何原因?此外,这看起来像是提取卡详细信息的正确方法吗,一次(如果以及何时)我这样做?谢谢!

【问题讨论】:

    标签: ios microblink


    【解决方案1】:

    这个问题是否与here 问题有关?

    如果是这样,我还可以提出以下建议: 您可以添加一个调用图像选择器的函数(我使用设备相机作为源类型):

    private func openImagePicker() {
            let imagePicker = UIImagePickerController()
            imagePicker.sourceType = .camera
            imagePicker.cameraDevice = .rear
    
            addOverlayLabel(toImagePicker: imagePicker)
            
            // Displays a control that allows the user to choose only photos
            imagePicker.mediaTypes = [kUTTypeImage as String]
            
            // Hides the controls for moving & scaling pictures, or for trimming movies.
            imagePicker.allowsEditing = false
            
            // Shows default camera control overlay over camera preview.
            imagePicker.showsCameraControls = true
            
            // set delegate
            imagePicker.delegate = self
            present(imagePicker, animated: true) {() -> Void in }
            imagePickerController = imagePicker
        }
    

    func recognizerRunner中可以放置状态无效时调用的func,像这样:

    extension ViewController: MBCScanningRecognizerRunnerDelegate {
    
    func recognizerRunner(_ recognizerRunner: MBCRecognizerRunner, didFinishScanningWith state: MBCRecognizerResultState) {
        DispatchQueue.main.async(execute: {() -> Void in
            if state != .valid {
                self.openImagePicker()
                return
            }
            
            print(state.rawValue)
            let result = self.blinkCardRecognizer.result
    
            print("Owner: \(result.owner)")
            print("Card number: \(result.cardNumber)")
            print("Card number prefix: \(result.cardNumberPrefix)")
            
        })
      }
    }
    

    如果状态无效,这将使您有机会重新拍摄图像。

    还要问一下,你把prepareToReadImage放在哪里?

    你需要把它放在func imagePickerController,像这样:

    extension ViewController: UIImagePickerControllerDelegate {
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let mediaType = info[UIImagePickerController.InfoKey.mediaType] as? String
        
        if CFStringCompare(mediaType as CFString?, kUTTypeImage, CFStringCompareFlags(rawValue: 9)) == .compareEqualTo {
            let originalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
            prepareToReadImage(originalImage)
        }
        
        picker.dismiss(animated: true, completion: nil)
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        serialQueue.async {
            self.recognizerRunner?.resetState()
        }
    
        dismiss(animated: true, completion: nil)
    
      }
    }
    

    最后,请确保在开始扫描过程之前放置识别器的设置。

    我添加了func setupRecognizerRunner,在这里我定义了你在代码块中所做的一切:

        private func setupRecognizerRunner() {
    
        blinkCardRecognizer = MBCBlinkCardRecognizer()
        var recognizers = [MBCRecognizer]()
        
        blinkCardRecognizer.extractCvv = false
        blinkCardRecognizer.extractIban = false
        blinkCardRecognizer.extractExpiryDate = false
        
        recognizers.append(blinkCardRecognizer)
        let recognizerCollection = MBCRecognizerCollection(recognizers: recognizers)
        recognizerRunner = MBCRecognizerRunner(recognizerCollection: recognizerCollection)
        
        recognizerRunner?.scanningRecognizerRunnerDelegate = self
    }
    

    我已经把它放在了viewDidLoad(),在加载了许可密钥方法之后。

    【讨论】:

      【解决方案2】:

      删除以下行让我得到.valid 响应:

      image?.cameraFrame = true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-24
        • 1970-01-01
        • 2010-09-12
        • 2017-05-17
        • 1970-01-01
        • 2013-07-27
        相关资源
        最近更新 更多