在iOS上使用ML Kit扫描条形码
您可以使用ML kit来识别并且解码条码。
有关此API使用的示例,请参阅GitHub上的ML Kit快速入门示例。
在开始之前
如果您还没有将Firebase添加到您的程序当中,那您可以从开始指南来开始您的工作。
将ML kit库放进您的Podfile中:
pod 'Firebase/Core'pod 'Firebase/MLVision'pod 'Firebase/MLVisionBarcodeModel'
而后每次您要安装或者升级您的Pods的时候,请确保使用您的Xcode项目的.xcworkspace来打开它。
在您的程序中,引入Firebase:
Swift:
import Firebase
Objective-C:
@import Firebase;
配置条形码识别器
如果您知道您希望读取哪种条形码格式,可以通过将其配置为仅检测这些格式来提高条形码识别器的识别速度。
Swift:
例如,假设只希望识别Aztec和QR码,您可以构建一个VisionBarcodeDetectorOptions 对象,如下所示:
let format = VisionBarcodeFormat.all// 或者, e.g.: VisionBarcodeFormat.qrCode | VisionBarcodeFormat.azteclet options = VisionBarcodeDetectorOptions(formats: format)
Objective-C:
例如,假设只希望识别Aztec和QR码,您可以构建一个 FIRVisionBarcodeDetectorOptions 对象,如下所示:
FIRVisionBarcodeDetectorOptions *options =[[FIRVisionBarcodeDetectorOptions alloc]initWithFormats: FIRVisionBarcodeFormatQRCode | FIRVisionBarcodeFormatAztec];
支持以下格式:
Swift:
- Code128
- Code39
- Code93
- CodaBar
- EAN13
- EAN8
- ITF
- UPCA
- UPCE
- DataMatrix
- QRCode
- PDF417
- Aztec
Objective-C:
- Code 128 (
FIRVisionBarcodeFormatCode128) - Code 39 (
FIRVisionBarcodeFormatCode39) - Code 93 (
FIRVisionBarcodeFormatCode93) - Codabar (
FIRVisionBarcodeFormatCodaBar) - EAN-13 (
FIRVisionBarcodeFormatEAN13) - EAN-8 (
FIRVisionBarcodeFormatEAN8) - ITF (
FIRVisionBarcodeFormatITF) - UPC-A (
FIRVisionBarcodeFormatUPCA) - UPC-E (
FIRVisionBarcodeFormatUPCE) - Data Matrix (
FIRVisionBarcodeFormatDataMatrix) - QR Code (
FIRVisionBarcodeFormatQRCode) - PDF417 (
FIRVisionBarcodeFormatPDF417) - Aztec (
FIRVisionBarcodeFormatAztec)
运行条形码识别器
为了能够识别图像中的条形码,将图像传递为UIImage或者CMSampleBufferRef到VisionBarcodeDetector的detect(in:)方法:
得到一个
VisionTextDetector实例:Swift:
lazy var vision = Vision.vision()let barcodeDetector = vision.barcodeDetector(options: options) // 检查错误。// 或者使用默认设置:// let barcodeDetector = vision?.barcodeDetector()
Objective-C:
FIRVision *vision = [FIRVision vision];FIRVisionBarcodeDetector *detector = [vision barcodeDetector];// 或者修改默认设置:// FIRVisionBarcodeDetector *detector =// [vision barcodeDetectorWithOptions:options];
使用
UIImage或者CMSampleBufferRef创建VisionImage对象。使用
UIImage:如果有必要,旋转图像,使得它的
imageOrientation的属性是.up。VisionImage使用正确旋转的对象创建一个对象UIImage。不要指定任何旋转元数据 - 默认值.topLeft,必须使用。Swift:
let image = VisionImage(image: uiImage)
Objective-C:
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
使用
CMSampleBufferRef:创建一个
VisionImageMetadata对象,该对象指定包含在CMSampleBufferRef缓冲区中的图像数据的方向 。例如,如果图像数据必须顺时针旋转90度才能保持直立:
Swift:
let metadata = VisionImageMetadata()metadata.orientation = .rightTop // Row为0在右边,column为0则是在顶端
Objective-C:
// Row为0在右边,column为0则是在顶端FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];metadata.orientation = FIRVisionDetectorImageOrientationRightTop;
VisionImage使用CMSampleBufferRef对象和旋转元数据创建一个对象 :Swift:
let image = VisionImage(buffer: bufferRef)image.metadata = metadata
Objective-C:
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:buffer];image.metadata = metadata;
然后,将图像传递给该
detect(in:)方法:Swift:
barcodeDetector.detect(in: visionImage) { (barcodes, error) inguard error == nil, let barcodes = barcodes, !barcodes.isEmpty else {// 错误,您应该检查控制台。// ...return}// 识别并且解读条形码// ...}
Objective-C:
[detector detectInImage:imagecompletion:^(NSArray<FIRVisionBarcode *> *barcodes,NSError *error) {if (error != nil) {return;} else if (barcodes != nil) {// 识别条形码// ...}}];
从条形码获取信息
如果条形码识别操作成功,则识别器将返回一个VisionBarcode对象数组 。每个VisionBarcode对象代表图像中检测到的条形码。对于每个条形码,您可以在输入图像中获取其边界坐标以及由条形码编码的原始数据。此外,如果条形码识别器能够确定条形码编码的数据类型,则可以获取包含解析数据的对象。
Swift:
for barcode in barcodes {let corners = barcode.cornerPointslet displayValue = barcode.displayValuelet rawValue = barcode.rawValuelet valueType = barcode.valueTypeswitch valueType {case .wiFi:let ssid = barcode.wifi!.ssidlet password = barcode.wifi!.passwordlet encryptionType = barcode.wifi!.typecase .URL:let title = barcode.url!.titlelet url = barcode.url!.urldefault:// 所有支持的数据类型请查看API列表}}
Objective-C:
for (FIRVisionBarcode *barcode in barcodes) {NSArray *corners = barcode.cornerPoints;NSString *displayValue = barcode.displayValue;NSString *rawValue = barcode.rawValue;FIRVisionBarcodeValueType valueType = barcode.valueType;switch (valueType) {case FIRVisionBarcodeValueTypeWiFi:// ssid = barcode.wifi.ssid;// password = barcode.wifi.password;// encryptionType = barcode.wifi.type;break;case FIRVisionBarcodeValueTypeURL:// url = barcode.URL.url;// title = barcode.URL.title;break;// ...default:break;}}
