zoukankan      html  css  js  c++  java
  • [Xcode 实际操作]七、文件与数据-(22)使用OCR光学字符识别技术识别银行卡号码

    目录:[Swift]Xcode实际操作

    本文将演示如何使用光学字符识别技术,识别信用卡上的卡号。

    OCR技术是光学字符识别的缩写(Optical Character Recognition),

    是通过扫描等光学输入方式将各种文字转化为图像信息,

    再利用文字识别技术将图像信息转化为可以使用的计算机输入技术。

    首先在浏览器的地址栏输入需要下载的第三方类库:card.io-iOS-SDK

    将解压后的文件夹【CardIO】拖动到项目【DemoApp】中,

    保持选项的默认设置,点击【Finish】完成文件夹的添加。

    【CardIO】文件夹主要包含了三个库文件和一些头文件。

    点击项目名称【DemoApp】,打开项目信息面板。

    进入【Build Settings】编译设置面板。

    在右上角搜索输入框内输入需要搜索的关键词:【Other Linker Flags】。

    找到所需的选项后,在右侧双击弹出设置框。

    在弹出的面板中,点击弹出面板左下角的【+】图标,进入文字输入状态。

    然后输入链接器参数:【-lc++】

    链接器做的事,就是把目标文件和所用的一些库链接在一起,形成一个完整的可执行文件。

    从代码到可执行文件经历的步骤是:

    【源代码】->【预处理器】->【编译器】->【汇编器】->【机器码】->【链接器】->【可执行文件】

    点击弹出面板左下角的【+】图标,再添加一个输入链接器参数:【-ObjC】

    添加了链接器参数:【-ObjC】后,链接器就会把静态库中所有的OC类和分类,都加载到最后的可执行文件中。

    在链接器设置面板外部点击,完成参数的设置。

    进入【Build Phases】编译阶段设置面板。

    在【Link Binary With Libraries】选项中,点击【+】往项目中添加需要用到的五个框架。

    在弹出窗口顶部的搜索框内,输入待添加的框架的名称:

    【Accelerate.framework】:在框架名称上双击,引入该框架

    【AVFoundation.framework】:在框架名称上双击,引入该框架

    【AudioToolbox.framework】:在框架名称上双击,引入该框架

    【CoreMedia.framework】:在框架名称上双击,引入该框架

    【MobileCoreServices.framework】:在框架名称上双击,引入该框架

    进入【Build Settings】编译设置面板。

    在右上角搜索输入框内输入需要搜索的关键词:【Enable Modules】。

    【Enable Modules】属性在默认情况下已经激活,如果没有激活的话,请把它调整为激活状态。

    在右上角搜索输入框内输入需要搜索的关键词:【Link Frameworks Automatically】。

    【Link Frameworks Automatically】属性在默认情况下已经激活,如果没有激活的话,请把它调整为激活状态。

    在【CardIO】文件夹上点击鼠标右键,弹出右键菜单。

    要在代码中调用文字识别框架的OC头文件,需要往项目中添加一个桥接头文件。

    【New File】->【Header File】->【Next】->【Save As】:CardIO-Swift-Bridging-Header.h->【Create】

    在桥接头文件【CardIO-Swift-Bridging-Header.h】中引入需要用到的头文件。

     1 #ifndef CardIO_Swift_Bridging_Header_h
     2 #define CardIO_Swift_Bridging_Header_h
     3 
     4 #import "CardIO.h"
     5 //在桥接头文件中引入需要用到的头文件。
     6 @import AudioToolbox;
     7 @import AVFoundation;
     8 @import CoreMedia;
     9 @import CoreVideo;
    10 @import MobileCoreServices;
    11 
    12 #endif /* CardIO_Swift_Bridging_Header_h */

    然后点击项目名称【DemoApp】,进入项目属性设置面板,确保桥接头文件,已经被项目所引用。

    进入【Build Settings】编译设置面板。

    在右上角搜索输入框内输入需要搜索的关键词:【Bridging Header】。

    然后在【Objective-C Bridging Header】文件属性右侧双击,弹出桥接头文件属性设置面板。

    接着输入桥接文件,在项目中的存储路径:DemoApp/CardIO/CardIO-Swift-Bridging-Header.h

    在项目导航区,打开视图控制器的代码文件【ViewController.swift】

    准备工作已经全部完成,现在开始编写代码,实现识别卡号的功能。

     1 import UIKit
     2 
     3 //首先导入需要用到的代理协议CardIOPaymentViewControllerDelegate
     4 //它将完成信用卡卡号识别的主要功能
     5 class ViewController: UIViewController, CardIOPaymentViewControllerDelegate {
     6     
     7     override func viewDidLoad() {
     8         super.viewDidLoad()
     9         // Do any additional setup after loading the view, typically from a nib.
    10         //当调用卡号识别的视图控制器时,因为需要加载各种资源,
    11         //所以比较耗费时间,可能会出现卡顿现象。
    12         //这里在调用前,进行一次预加载,以避免卡顿现象。
    13         CardIOUtilities.preload()
    14         
    15         //创建一个按钮对象,当点击该按钮时,弹出卡号识别的视图控制器,
    16         //在该视图控制器中,进行卡号识别的主要工作。
    17         let button = UIButton(frame: CGRect(x: 40, y: 80,  240, height: 40))
    18         //设置按钮标题文字
    19         button.setTitle("Scan Card", for: .normal)
    20         //设置按钮背景颜色
    21         button.backgroundColor = UIColor.brown
    22         //给按钮绑定点击事件
    23         button.addTarget(self, action: #selector(ViewController.scanCard(_:)), for: UIControl.Event.touchUpInside)
    24         
    25         //将按钮添加到当前视图控制器的根视图
    26         self.view.addSubview(button)
    27     }
    28     
    29     //添加一个方法,用来响应按钮的点击事件
    30     @objc func scanCard(_ sender: UIButton!)
    31     {
    32         //初始化卡号识别视图控制器
    33         let cardIOVC = CardIOPaymentViewController(paymentDelegate: self)
    34         //设置卡号识别视图控制器的展示样式
    35         cardIOVC?.modalPresentationStyle = .formSheet
    36         //以模态窗口的方式,显示卡号识别视图控制器
    37         present(cardIOVC!, animated: true, completion: nil)
    38     }
    39     
    40     //添加一个方法,用来响应用户取消识别的动作
    41     func userDidCancel(_ paymentViewController: CardIOPaymentViewController!)
    42     {
    43         //在控制台打印输出相关的日志
    44         print("user canceled")
    45         //并隐藏卡号识别视图控制器
    46         paymentViewController?.dismiss(animated: true, completion: nil)
    47     }
    48     
    49     //添加另一个代理方法,用来响应用户点击完成按钮的事件
    50     func userDidProvide(_ cardInfo: CardIOCreditCardInfo!, in paymentViewController: CardIOPaymentViewController!)
    51     {
    52         //创建一个字符串常量,用来存储识别到的信用卡的所有信息
    53         if let info = cardInfo
    54         {
    55             let str = NSString(format: "Received card info.
     Number: %@
     expiry: %02lu/%lu
     cvv: %@.",
    56              info.cardNumber, 
    57              info.expiryMonth, 
    58              info.expiryYear, 
    59              info.cvv)
    60 
    61             //在控制台打印输出所有信息
    62             print(str)
    63         }
    64         //同时隐藏卡号识别视图控制器
    65         paymentViewController?.dismiss(animated: true, completion: nil)
    66     }
    67 }

    然后点击【DemoApp/IPhone】模拟器名称,弹出模拟器列表,在弹出的模拟器列表中,选择真机选项,该项目需要在真机设备上进行测试。

  • 相关阅读:
    C#发送Email邮件(实例:QQ邮箱和Gmail邮箱)
    MD5
    关节疼
    c#写入Mysql中文显示乱码 解决方法 z
    浅析基层检察院派驻乡镇检察室的健康发展 z
    查询数据库中所有名称相同的记录
    一个简单功能的SQL 实现
    java 的""和null的区别
    java 的 &和&&的区别
    mysql left join,right join,inner join的区别
  • 原文地址:https://www.cnblogs.com/strengthen/p/10053869.html
Copyright © 2011-2022 走看看