iOS-MLKit 扫条形码

        项目中需要扫二维码、扫条形码,用了AVFoundation框架。  

        但是AVCaptureMetadataOutput扫条形码较弱,经常会有扫不到的情况,因此接入了google的MLKit。MLKit框架地址

Note: ML Kit iOS APIs only run on 64-bit devices. If you build your app with 32-bit support, check the device's architecture before using this API.
MLKit只支持64位,所以developmentinfo的version要改成10.0之后。(ios10.3之后弃用32位了)

        我们只用到了sdk的扫码,所以直接pod 'GoogleMLKit/BarcodeScanning'

        BarcodeScanning的大致原理是从摄像头的每一帧转为图片,再从图片中扫描是否有二维码、条形码。   

        导入框架后,然后修改AVCaptureMetadataOutput为AVCaptureVideoDataOutput

        相应的delegate

        从
- (void)captureOutput:(AVCaptureOutput *)captureOutputdidOutputMetadataObjects:(NSArray *)metadataObjectsfromConnection:(AVCaptureConnection *)connection;

        变为
- (void)captureOutput:(AVCaptureOutput *)captureOutputdidOutputSampleBuffer:(CMSampleBufferRef)sampleBufferfromConnection:(AVCaptureConnection *)connection ;

        核心代码: 

//图片输入
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image];

 visionImage.orientation = image.imageOrientation;


//配置需要扫码的类型

    MLKBarcodeScannerOptions *options =

    [[MLKBarcodeScannerOptions alloc]

     initWithFormats:

     MLKBarcodeFormatEAN8 |

     MLKBarcodeFormatCode128 |

     MLKBarcodeFormatEAN13|

     MLKBarcodeFormatQRCode];

//结果输出

MLKBarcodeScanner *barcodeScanner = [MLKBarcodeScanner barcodeScannerWithOptions:options];

    [barcodeScanner processImage:visionImage

                      completion:^(NSArray *_Nullablebarcodes,

                                   NSError *_Nullableerror) {

        if(error !=nil) {

            return;

        }

        if(barcodes.count >0) {

            NSLog(@"扫到东西了");

            for(MLKBarcode *barcode in barcodes) {

                NSArray *corners = barcode.cornerPoints;

                NSString *displayValue = barcode.displayValue;

                NSString *rawValue = barcode.rawValue;

                MLKBarcodeValueType valueType = barcode.valueType;

                NSLog(@"displayValue:%@",displayValue);

                NSLog(@"rawValue:%@",rawValue);

                   }

captureOutputdidOutputSampleBuffer代理方法输出帧数较高,可以加个定时器,比如隔0.5秒输出一次结果

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容