PassportScanner
在分支上工作
在这个分支中,GPUImage 库已经被升级到了 GPUImage2。当前状态如下:
- 更简洁的代码
- 有两个扫描方法的版本,每个版本都有其自身缺点。(崩溃或图像保存到磁盘)
- 由于某些原因,tesseract 只扫描图像的左侧部分。
这是什么
通过 PassportScanner,您可以使用相机扫描护照的 MRZ 代码。它将提取所有数据,如名、姓、护照号码、国籍、出生日期、失效日期和个人编号。
重要通知:扫描身份证件在大多数情况下都受到法律的限制。使用此工具时,请遵守相关法律。本工具的版权所有者不对本工具的非法使用承担任何责任。
PassportScanner 正在尝试通过先执行一些图形滤镜来优化 OCR 结果。曝光滤镜是动态的。这意味着如果图像较暗,它会尝试使图像变亮,反之亦然。正如您在下方的演示动画中可以看到,您大约每3秒就能扫描一次护照。
等待下面的 .gif 文件下载完成...
构建 PassportScanner 示例
当前版本已与 Xcode 7 和 Xcode 7.1 beta 1 进行测试。
-
克隆仓库到工作目录。
-
CocoaPods 用于管理依赖。Pods 设置简单,通过 Ruby Gem 分发。按照网站上的简单说明进行设置。设置完成后,从 PassportScanner 的顶级目录中运行以下命令以下载依赖项:
pod install
-
在 Xcode 中打开
PassportScanner.xcworkspace
。 -
构建并运行应用。
演示的外部组件
PassportScanner 使用以下组件,可使用 CocoaPods 安装。
- TesseractOCRiOS Tesseract OCR iOS 是一个适用于 iOS7+ 的框架。
- GPUImage 基于GPU的图像和视频处理的开源iOS框架。
- UIImage-Resize 对 UIImage 类添加一些调整大小方法,用于将其调整到给定的 CGSize - 或者在保持纵横比的情况下 fit 到 CGSize。
在自己的应用中使用 PassportScanner
当前,“PassportScanner” 通过依赖管理器 CocoaPods 可用。此时,可以通过执行以下命令进行安装:
[sudo] gem install cocoapods
如果您已安装 Cocoapods,您只需确保以下行包含在您的 Podfile 中,即可将 PassportScanner 添加到您的 workspace:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod "PassportScanner"
在您的 swift 文件顶部添加一个导入,如下所示:
import PassportScanner
如果需要支持低于 iOS 8.0 的旧版本,则还可以只是复制包含 2 个类 MRZ 和 PassportScannerController 的 Pod 文件夹到您的应用中。同时,将上述提到的外部组件添加到您的 podfile 中。
当将 PassportScanner 添加到您的项目中时,将演示应用的 Main.storyboard 中的 PassportScanner 视图复制到您自己的 storyboard 中。之后,您可以自定义该视图。同时,将 MyScanViewController.swift 复制到您的项目中。查看 ViewConroller.swift 文件,了解如何初始化视图和获取 MRZ 数据。
还将 tessdata 文件夹复制到我们的应用程序中。该文件夹包含 tesseract(OCR 引擎)的训练数据。
以下是 PassportScannerController 的示例代码:
protocol ProcessMRZ {
func processMRZ(mrz:MRZ)
}
class MyScanViewController: PassportScannerController {
var delegate: ProcessMRZ?
// the .StartScan and .EndScan are IBOutlets and can be linked to your own buttons
/**
For now just start scanning the moment this view is loaded
*/
override func viewDidLoad() {
super.viewDidLoad()
self.debug = true // So that we can see what's going on (scan text and quality indicator)
self.accuracy = 1 // 1 = all checksums should pass
self.StartScan(self)
}
override func succesfullScan(mrz: MRZ) {
print("mrz: {\(mrz.description)\n}")
delegate?.processMRZ(mrz)
self.dismissViewControllerAnimated(true, completion: nil)
}
override func abbortScan() {
self.dismissViewControllerAnimated(true, completion: nil)
}
}
然后在您的代码中,您可以使用这种方式访问 PassportScannerController 并处理 MRZ 数据:
class ViewController: UIViewController, ProcessMRZ {
@IBOutlet weak var mrzLabel: UILabel!
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait
}
override func prefersStatusBarHidden() -> Bool {
return true
}
@IBAction func StartScan(sender: AnyObject) {
let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let scanVC: MyScanViewController = storyboard.instantiateViewControllerWithIdentifier("PassportScanner") as! MyScanViewController
scanVC.delegate = self
self.presentViewController(scanVC, animated: true, completion: nil)
}
func processMRZ(mrz:MRZ) {
self.mrzLabel.text = mrz.description
mrzLabel.sizeToFit()
}
}
许可证
PassportScanner 在 MIT 3 许可证下提供。有关更多信息,请参阅 LICENSE 文件。
我的其他库
也查看我的其他开源 iOS 库
- EVReflection - 基于 (字典、CKRecord、JSON 和 XML) 反射的对象映射,Alamofire 和 Moya 扩展兼容 RxSwift 或 ReactiveSwift
- EVCloudKitDao - 简化对 Apple CloudKit 的访问
- EVFaceTracker - 根据您设备与脸部的关系计算相距和角度,以模拟 3D 效果
- EVURLCache - 一个 NSURLCache 子类,用于处理所有使用 NSURLReques 发起的网页请求
- AlamofireOauth2 - 使用 Alamofire 实现的 OAuth2
- EVWordPressAPI - 使用 AlamofireOauth2、AlomofireJsonToObjects 和 EVReflection 实现的 WordPress(Jetpack)API 的 Swift 实现(工作进行中)
- PassportScanner - 扫描护照的 MRZ 代码并提取姓、名、护照号码、国籍、出生日期、过期日期和人员编号
- AttributedTextView - 用于创建带有支持多个链接(网址、话题、提及)的属性化 UITextView 的最简单方法