[Xcode 實際操做]7、文件與數據-(22)使用OCR光學字符識別技術識別銀行卡號碼

目錄:[Swift]Xcode實際操做html

本文將演示如何使用光學字符識別技術,識別信用卡上的卡號。c++

OCR技術是光學字符識別的縮寫(Optical Character Recognition),git

是經過掃描等光學輸入方式將各類文字轉化爲圖像信息,github

再利用文字識別技術將圖像信息轉化爲可使用的計算機輸入技術。swift

首先在瀏覽器的地址欄輸入須要下載的第三方類庫:card.io-iOS-SDK瀏覽器

將解壓後的文件夾【CardIO】拖動到項目【DemoApp】中,框架

保持選項的默認設置,點擊【Finish】完成文件夾的添加。ide

【CardIO】文件夾主要包含了三個庫文件和一些頭文件。post

點擊項目名稱【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, width: 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.\n Number: %@\n expiry: %02lu/%lu\n 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】模擬器名稱,彈出模擬器列表,在彈出的模擬器列表中,選擇真機選項,該項目須要在真機設備上進行測試。

相關文章
相關標籤/搜索