首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microblink:成功读取图片

Microblink:成功读取图片
EN

Stack Overflow用户
提问于 2021-03-16 21:33:03
回答 2查看 58关注 0票数 1

我要求Microblink读卡器查看卡片的照片,而不是使用相机。我尝试过肖像卡和风景版的万事达卡。下面是我声明我的主要变量的方式:

代码语言:javascript
复制
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)
}()

我声明了这两个委托:

代码语言:javascript
复制
MBCBlinkCardOverlayViewControllerDelegate, MBCScanningRecognizerRunnerDelegate

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

代码语言:javascript
复制
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的状态

代码语言:javascript
复制
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响应的原因是什么?此外,这看起来像是一次(如果和何时)提取卡详细信息的正确方式吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2021-03-18 20:12:43

此问题是否与问题here相关

如果是这样,我也可以建议如下:你可以添加一个调用图像选择器的函数(我使用设备的摄像头作为源类型):

代码语言:javascript
复制
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中,当状态无效时,您可以放置要调用的函数,如下所示:

代码语言:javascript
复制
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中,如下所示:

代码语言:javascript
复制
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,我在其中定义了您在代码块中执行的所有操作:

代码语言:javascript
复制
    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()中。

票数 3
EN

Stack Overflow用户

发布于 2021-03-26 08:03:04

删除以下行允许我获得.valid响应:

代码语言:javascript
复制
image?.cameraFrame = true
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66656255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档