【问题标题】:Microblink: reading an imageMicroblink:读取图像
【发布时间】:2021-03-12 18:32:38
【问题描述】:

我要求 Microblink 读卡器查看卡片的照片,而不是使用相机:

lazy var blinkCardRecognizer: MBCBlinkCardRecognizer = {
    return MBCBlinkCardRecognizer()
}()
lazy var recognizerCollection: MBCRecognizerCollection = {
    blinkCardRecognizer.extractCvv = false
    blinkCardRecognizer.extractIban = false
    blinkCardRecognizer.extractExpiryDate = false
    
    let recognizerList = [blinkCardRecognizer]
    return MBCRecognizerCollection(recognizers: recognizerList)
}()

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

MBCBlinkCardOverlayViewControllerDelegate, MBCScanningRecognizerRunnerDelegate

我确定我正在向这个函数传递一个正确的 UIImage,并且我确实得到了 processImage 调用:

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

但是这个回调没有被命中:

func recognizerRunner(_ recognizerRunner: MBCRecognizerRunner, didFinishScanningWith state: MBCRecognizerResultState) {
    if state == .valid {
        print (state)
    }
}

你能明白为什么不是吗?我看到日志警告You are using time-limited license key! 有关系吗?

【问题讨论】:

  • 你的recognizerRunner是一个局部变量,一旦函数退出(即识别完成之前)就会被释放。将其设为属性而不是局部变量。

标签: ios microblink


【解决方案1】:

从提供的代码中,我可以看到 recognizerRunnerprepareToReadImage 方法已正确输入。 但是,在您定义识别器和recognizerCollection 的第一个代码块中,我可以看到问题可能出在MBCRecognizerCollection 上,因为它的参数recognizers 的类型为[MBCRecognizer],你把[MBCBlinkCardRecognizer]放在那里。我可以建议这个解决方案,看看它是否有效:

    blinkCardRecognizer = MBCBlinkCardRecognizer()
    var recognizerList = [MBCRecognizer]()
    
    let recognizerCollection: MBCRecognizerCollection = {
        blinkCardRecognizer.extractCvv = false
        blinkCardRecognizer.extractIban = false
        blinkCardRecognizer.extractExpiryDate = false
        
        recognizerList.append(blinkCardRecognizer!)
        return MBCRecognizerCollection(recognizers: recognizerList)
    }()

    recognizerRunner = MBCRecognizerRunner(recognizerCollection: recognizerCollection)

唯一的区别是我之前定义了 BlinkCardRecognizer 和 RecognizerRunner,所以应该没有任何区别:

private var recognizerRunner: MBCRecognizerRunner?
private var blinkCardRecognizer: MBCBlinkCardRecognizer?

这里补充一下,看到You are using time-limited license key!没关系,只是说明你使用的是限时键,应该不会影响扫描过程。

【讨论】:

  • 谢谢你,米兰,didFinishScanning 现在接到电话了。但是,状态始终为empty。知道为什么会这样吗? (我正在使用信用卡的质量很好的 jpeg 格式)
  • 这个问题是只出现在一张卡上,还是出现在多张卡上?这张卡片是真实的,还是例如在互联网上找到的样本?
  • 我尝试过使用两种不同的信用卡(visa 和 MC),都是我的个人信用卡,都有效。我用手机相机拍了两张照片。如果你愿意,我可以给你看其中一个(当然是经过编辑的!哈哈)。
  • 嗨 coco,我在这里也给了你一个答案:stackoverflow.com/questions/66656255/… 如果有帮助,请告诉我。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
相关资源
最近更新 更多