Anyline圖像識別簡單說明

一. 基礎說明

1. 集成方式

手動導入集成,cocoapods沒有反應一直等待,不知道是cocoapods版本緣由仍是什麼。官方集成文檔html

2. 如何實現Anyline插件

Anyline 4開始,每一個用例須要三個組件才能成功掃描,就是說在你想要實現掃描功能的控制器種添加下面三個組件就能夠了:ios

  • ScanPlugin

    處理圖像識別和掃描功能 有關掃描的功能所有由該插件處理git

  • ScanViewPlugin

    處理UI相關,關於UI的配置json

  • ScanView

    scanview將處理相機、閃光燈並管理先前建立的scanviewplugin和scanplugin。 關於UI的配置也由ScanView來呈現bash

3. 添加插件到ViewController

添加組件到控制器app

// The Anyline plugins used to scan
@property (nonatomic, strong) ALMeterScanViewPlugin *meterScanViewPlugin;
@property (nonatomic, strong) ALMeterScanPlugin *meterScanPlugin;
@property (nullable, nonatomic, strong) ALScanView *scanView;
複製代碼

4. 插件說明

ScanPlugin初始化

初始化的時候須要用到在網站上生成的密鑰iview

//ALMeterScanPlugin是針對水錶的類型,根據業務選擇合適的plugin(下文出現的同理)
    NSError *error = nil;
    self.meterScanPlugin = [[ALMeterScanPlugin alloc] initWithPluginID:@"ENERGY" licenseKey:kDemoAppLicenseKey delegate:self error:&error];
    NSAssert(self.meterScanPlugin, @"Setup Error: %@", error.debugDescription);
複製代碼

上面代碼裏密鑰須要生成,ID只要保證是一個惟一性的字符串就能夠ide

ScanViewPlugin初始化

初始化scanplugin以後,下一步是使用剛剛建立的scanplugin建立scanviewplugin。scanviewplugin將處理並顯示用於掃描的UI。網站

//Add Meter Scan View Plugin (Scan UI)
  self.meterScanViewPlugin = [[ALMeterScanViewPlugin alloc] initWithScanPlugin:self.meterScanPlugin];
複製代碼
設置ScanViewPluginConfig

視圖掃描過程的外觀。您能夠按如下方式設置 先生成一個json文件,在文件裏配置參數,具體參數意義參考官網配置說明ui

NSString *confPath = [[NSBundle mainBundle] pathForResource:@"meter_capture_config" ofType:@"json"];
ALScanViewPluginConfig *scanViewPluginConfig = [ALScanViewPluginConfig configurationFromJsonFilePath:confPath];

self.meterScanViewPlugin = [[ALMeterScanViewPlugin alloc] initWithScanPlugin:self.meterScanPlugin
                                                scanViewPluginConfig:scanViewPluginConfig];
複製代碼
ScanView

最後須要建立的anyline對象是所謂的scanview,它將處理相機、閃光燈並管理先前建立的scanviewplugin和scanplugin。您須要用先前建立的scanviewplugin實例化scanview。一般,這就是咱們看到的相機界面。

//Add ScanView (Camera and Flashbutton)
self.scanView = [[ALScanView alloc] initWithFrame:frame scanViewPlugin:self.meterScanViewPlugin];
[self.view addSubview:self.scanView];
[self.scanView startCamera];

複製代碼

開始掃描

注意: 在啓動任何行爲以前,確保在viewDidLoad中使用了[scanView startCamera]

/*
 This method will be called once the view controller and its subviews have appeared on screen
 */
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    /*
     This is the place where we tell Anyline to start receiving and displaying images from the camera.
     Success/error tells us if everything went fine.
     */
    NSError *error = nil;
    BOOL success = [self.meterScanViewPlugin startAndReturnError:&error];
    if( !success ) {
        // Something went wrong. The error object contains the error description
        [[[UIAlertView alloc] initWithTitle:@"Start Scanning Error"
                                    message:error.debugDescription
                                   delegate:self
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil] show];
    }
}
複製代碼

中止掃描

要中止掃描過程,請在插件上調用stopandreturnerror: 要確保sdk在離開活動時正確中止,至少保證在uiviewcontrollerviewwilldisplases:lifecycle方法中使用stopandreturnerror:

/*
 Cancel scanning to allow the module to clean up
 */
- (void)viewWillDisappear:(BOOL)animated {
    [self.meterScanViewPlugin stopAndReturnError:nil];
}
複製代碼

檢查密鑰的到期時間

密鑰過時會引發錯誤,提供了一個靜態方法來檢查許可證密鑰字符串的到期日期。將返回包含日期的nsstring。若是沒法分析許可證,將返回一個錯誤

NSError *error = nil;
NSString *dateString = [ALCoreController licenseExpirationDateForLicense:YOUR_LICENSE_KEY_STRING error:&error];
複製代碼

後續說明具體開發的一些細節和問題....


二. 插件細節

Anyline提供了6種插件,根據業務來選擇合適的插件,下面簡單介紹下其中的一種MeterPlugin

MeterPlugin

Anyline能源插件可以掃描模擬電錶、煤氣表和水錶的讀數。也能夠掃描條形碼和二維碼,這對識別儀表和序列號頗有用。普通的數字表和熱量表也能夠掃描。

若是要實現該插件,首先上文提到的基礎是都要實現的,文末會給出一個完整的代碼,先來看一些細節。

掃描界面UI配置相關
NSString *confPath = [[NSBundle mainBundle] pathForResource:@"meter_capture_config" ofType:@"json"];
ALScanViewPluginConfig *scanViewPluginConfig = [ALScanViewPluginConfig configurationFromJsonFilePath:confPath];

self.meterScanViewPlugin = [[ALMeterScanViewPlugin alloc] initWithScanPlugin:self.meterScanPlugin
                                                scanViewPluginConfig:scanViewPluginConfig];
複製代碼

上面代碼就是設置掃描界面UI代碼,其中的重點是咱們要在項目中生成一個json文件來配置,以上面代碼爲例就是要新建一個meter_capture_config .json文件,例如設置相機和閃光燈按鈕:

{
"camera": {
    "captureResolution": "1080",
    "pictureResolution": "1080",
    "zoomGesture" : true,
    "zoomRatio" : 2,
    "maxZoomRatio" : 5
},
"flash": {
    "mode": "manual",
    "alignment": "bottom_right"
},
}
複製代碼

更多UI配置說明

設置掃描模式

在用來掃描水電錶的Meter插件中又細化爲不少用例,經過將掃描模式設置爲相應的用例,能夠從meter插件啓動與之相關的用例。

//Set ScanMode to ALAutoAnalogDigitalMeter
//這裏的 ALAutoAnalogDigitalMeter 是一種類型,該類型描述爲:掃描全部類型的模擬儀表(如煤氣表、電錶、水錶),自動檢測小數點先後的位數,以及至少3位的7段數字儀表。
    BOOL success = [self.meterScanPlugin setScanMode:ALAutoAnalogDigitalMeter error:&error];
    if( !success ) {
        // Something went wrong. The error object contains the error description
        [[[UIAlertView alloc] initWithTitle:@"設置掃描類型失敗"
                                    message:error.debugDescription
                                   delegate:self
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil] show];
        
    }
複製代碼

下面是一張Meter插件包含的掃描模式圖,具體說明點這裏

scanmode.jpg

掃描結果回調(TheMeterDelegate)

在控制器中遵循協議<ALMeterScanPluginDelegate>,在代理方法anylineMeterScanPlugin:didFindScanResult: 中獲得掃描結果

獲得的掃描結果爲 ALMeterResult,該結果類包含了實際的掃描結果、掃描圖像和最後處理的全幀圖像

  • ALMeterResult
Field Type Nullable Description
result NSString 掃描過程的實際結果
image UIImage 掃描中裁剪的圖像
fullImage UIImage 完整的圖像
confidence NSInteger 掃描結果的準確度
#pragma mark - ALMeterScanPluginDelegate methods
/*
 The main delegate method Anyline uses to report its scanned codes
 */
- (void)anylineMeterScanPlugin:(ALMeterScanPlugin *)anylineMeterScanPlugin
                 didFindResult:(ALMeterResult *)scanResult {
    
    [self anylineDidFindResult:scanResult.result barcodeResult:self.barcodeResult image:(UIImage*)scanResult.image scanPlugin:anylineMeterScanPlugin viewPlugin:self.meterScanViewPlugin  completion:^{
        //Display the result
    }];
}
複製代碼

一個完整的代碼:

//
//  SHMeterScanViewController.m
//  TimeHomeApp
//
//  Created by ning on 2019/9/26.
//  Copyright © 2019 SafeHome. All rights reserved.
//

#import "SHMeterScanViewController.h"
#import <Anyline/Anyline.h>

#define kDemoAppLicenseKey @"你申請的key"
@interface SHMeterScanViewController ()<ALMeterScanPluginDelegate>

@property (nonatomic, strong) ALMeterScanViewPlugin *meterScanViewPlugin;
@property (nonatomic, strong) ALMeterScanPlugin *meterScanPlugin;
@property (nullable, nonatomic, strong) ALScanView *scanView;

@end

@implementation SHMeterScanViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *confPath = [[NSBundle mainBundle] pathForResource:@"vin_capture_config" ofType:@"json"];
    //Initiate the ALScanViewPluginConfig with the JSON file
    ALScanViewPluginConfig *scanViewPluginConfig = [ALScanViewPluginConfig configurationFromJsonFilePath:confPath];
    
    NSError *error = nil;
    self.meterScanPlugin = [[ALMeterScanPlugin alloc] initWithPluginID:@"ENERGY" licenseKey:kDemoAppLicenseKey delegate:self error:&error];
    
    self.meterScanViewPlugin = [[ALMeterScanViewPlugin alloc]initWithScanPlugin:self.meterScanPlugin scanViewPluginConfig:scanViewPluginConfig];
    
    //Set ScanMode to ALAutoAnalogDigitalMeter
    BOOL success = [self.meterScanPlugin setScanMode:ALAutoAnalogDigitalMeter error:&error];
    if( !success ) {
        // Something went wrong. The error object contains the error description
        [[[UIAlertView alloc] initWithTitle:@"Set ScanMode Error"
                                    message:error.debugDescription
                                   delegate:self
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil] show];
        
    }
    
    //Add ScanView (Camera and Flashbutton)
    CGRect frame = [[UIScreen mainScreen] applicationFrame];
    frame = CGRectMake(frame.origin.x, frame.origin.y + self.navigationController.navigationBar.frame.size.height, frame.size.width, frame.size.height - self.navigationController.navigationBar.frame.size.height);
    
    self.scanView = [[ALScanView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight) scanViewPlugin:self.meterScanViewPlugin];
    
    //Enable Zoom Gesture
    [self.scanView enableZoomPinchGesture:YES];
    
    //Adding the scanView
    [self.view addSubview:self.scanView];
    [self.scanView startCamera];
    
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    /*
     This is the place where we tell Anyline to start receiving and displaying images from the camera.
     Success/error tells us if everything went fine.
     */
    NSError *error = nil;
    BOOL success = [self.meterScanViewPlugin startAndReturnError:&error];
    if( !success ) {
        // Something went wrong. The error object contains the error description
        [QMUITips showError:@"Start Scanning Error"];
    }
}

/*
 Cancel scanning to allow the module to clean up
 */
- (void)viewWillDisappear:(BOOL)animated {
    [self.meterScanViewPlugin stopAndReturnError:nil];
}
#pragma mark - ALMeterScanPluginDelegate methods
/*
 The main delegate method Anyline uses to report its scanned codes
 */
- (void)anylineMeterScanPlugin:(ALMeterScanPlugin *)anylineMeterScanPlugin
                 didFindResult:(ALMeterResult *)scanResult {
    
    NSLog(@"%@",scanResult);
    QMUIAlertAction *action1 = [QMUIAlertAction actionWithTitle:@"取消" style:QMUIAlertActionStyleCancel handler:NULL];
    QMUIAlertController *alertController = [QMUIAlertController alertControllerWithTitle:@"結果" message:scanResult.result preferredStyle:QMUIAlertControllerStyleAlert];
    [alertController addAction:action1];
    [alertController showWithAnimated:YES];
    
}



@end

複製代碼
相關文章
相關標籤/搜索