Anyline圖像識(shí)別簡(jiǎn)單說(shuō)明

一. 基礎(chǔ)說(shuō)明

1. 集成方式

手動(dòng)導(dǎo)入集成,cocoapods沒(méi)有反應(yīng)一直等待凭迹,不知道是cocoapods版本原因還是什么罚屋。官方集成文檔

2. 如何實(shí)現(xiàn)Anyline插件

Anyline 4開(kāi)始,每個(gè)用例需要三個(gè)組件才能成功掃描嗅绸,就是說(shuō)在你想要實(shí)現(xiàn)掃描功能的控制器種添加下面三個(gè)組件就可以了:

  • ScanPlugin

    處理圖像識(shí)別和掃描功能
    有關(guān)掃描的功能全部由該插件處理

  • ScanViewPlugin

    處理UI相關(guān),關(guān)于UI的配置

  • ScanView

    scanview將處理相機(jī)脾猛、閃光燈并管理先前創(chuàng)建的scanviewplugin和scanplugin。
    關(guān)于UI的配置也由ScanView來(lái)呈現(xiàn)

3. 添加插件到ViewController

添加組件到控制器

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

4. 插件說(shuō)明

ScanPlugin初始化

初始化的時(shí)候需要用到在網(wǎng)站上生成的密鑰

//ALMeterScanPlugin是針對(duì)水表的類型鱼鸠,根據(jù)業(yè)務(wù)選擇合適的plugin(下文出現(xiàn)的同理)
    NSError *error = nil;
    self.meterScanPlugin = [[ALMeterScanPlugin alloc] initWithPluginID:@"ENERGY" licenseKey:kDemoAppLicenseKey delegate:self error:&error];
    NSAssert(self.meterScanPlugin, @"Setup Error: %@", error.debugDescription);

上面代碼里密鑰需要生成猛拴,ID只要保證是一個(gè)唯一性的字符串就可以

ScanViewPlugin初始化

初始化scanplugin之后,下一步是使用剛剛創(chuàng)建的scanplugin創(chuàng)建scanviewplugin蚀狰。scanviewplugin將處理并顯示用于掃描的UI愉昆。

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

視圖掃描過(guò)程的外觀。您可以按以下方式設(shè)置
先生成一個(gè)json文件麻蹋,在文件里配置參數(shù)跛溉,具體參數(shù)意義參考官網(wǎng)配置說(shuō)明

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

最后需要?jiǎng)?chuàng)建的anyline對(duì)象是所謂的scanview,它將處理相機(jī)、閃光燈并管理先前創(chuàng)建的scanviewplugin和scanplugin倒谷。您需要用先前創(chuàng)建的scanviewplugin實(shí)例化scanview蛛蒙。通常糙箍,這就是我們看到的相機(jī)界面渤愁。

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

開(kāi)始掃描

注意:
在啟動(dòng)任何行為之前,確保在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];
    }
}

停止掃描

要停止掃描過(guò)程抖格,請(qǐng)?jiān)诓寮险{(diào)用stopandreturnerror:
要確保sdk在離開(kāi)活動(dòng)時(shí)正確停止,至少保證在uiviewcontrollerviewwilldisplases:lifecycle方法中使用stopandreturnerror:

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

檢查密鑰的到期時(shí)間

密鑰過(guò)期會(huì)引起錯(cuò)誤,提供了一個(gè)靜態(tài)方法來(lái)檢查許可證密鑰字符串的到期日期咕晋。將返回包含日期的nsstring雹拄。如果無(wú)法分析許可證,將返回一個(gè)錯(cuò)誤

NSError *error = nil;
NSString *dateString = [ALCoreController licenseExpirationDateForLicense:YOUR_LICENSE_KEY_STRING error:&error];

后續(xù)說(shuō)明具體開(kāi)發(fā)的一些細(xì)節(jié)和問(wèn)題....


二. 插件細(xì)節(jié)

Anyline提供了6種插件掌呜,根據(jù)業(yè)務(wù)來(lái)選擇合適的插件滓玖,下面簡(jiǎn)單介紹下其中的一種MeterPlugin

MeterPlugin

Anyline能源插件能夠掃描模擬電表、煤氣表和水表的讀數(shù)质蕉。也可以掃描條形碼和二維碼势篡,這對(duì)識(shí)別儀表和序列號(hào)很有用。普通的數(shù)字表和熱量表也可以掃描模暗。

如果要實(shí)現(xiàn)該插件禁悠,首先上文提到的基礎(chǔ)是都要實(shí)現(xiàn)的,文末會(huì)給出一個(gè)完整的代碼兑宇,先來(lái)看一些細(xì)節(jié)碍侦。

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

self.meterScanViewPlugin = [[ALMeterScanViewPlugin alloc] initWithScanPlugin:self.meterScanPlugin
                                                scanViewPluginConfig:scanViewPluginConfig];

上面代碼就是設(shè)置掃描界面UI代碼,其中的重點(diǎn)是我們要在項(xiàng)目中生成一個(gè)json文件來(lái)配置隶糕,以上面代碼為例就是要新建一個(gè)meter_capture_config .json文件瓷产,例如設(shè)置相機(jī)和閃光燈按鈕:

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

更多UI配置說(shuō)明

設(shè)置掃描模式

在用來(lái)掃描水電表的Meter插件中又細(xì)化為很多用例,通過(guò)將掃描模式設(shè)置為相應(yīng)的用例枚驻,可以從meter插件啟動(dòng)與之相關(guān)的用例濒旦。

 //Set ScanMode to ALAutoAnalogDigitalMeter
//這里的 ALAutoAnalogDigitalMeter 是一種類型,該類型描述為:掃描所有類型的模擬儀表(如煤氣表测秸、電表疤估、水表),自動(dòng)檢測(cè)小數(shù)點(diǎn)前后的位數(shù)霎冯,以及至少3位的7段數(shù)字儀表芯杀。
    BOOL success = [self.meterScanPlugin setScanMode:ALAutoAnalogDigitalMeter error:&error];
    if( !success ) {
        // Something went wrong. The error object contains the error description
        [[[UIAlertView alloc] initWithTitle:@"設(shè)置掃描類型失敗"
                                    message:error.debugDescription
                                   delegate:self
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil] show];
        
    }

下面是一張Meter插件包含的掃描模式圖,具體說(shuō)明點(diǎn)這里

scanmode.jpg

掃描結(jié)果回調(diào)(TheMeterDelegate)

在控制器中遵循協(xié)議<ALMeterScanPluginDelegate>,在代理方法anylineMeterScanPlugin:didFindScanResult: 中得到掃描結(jié)果

得到的掃描結(jié)果為 ALMeterResult,該結(jié)果類包含了實(shí)際的掃描結(jié)果铸豁、掃描圖像和最后處理的全幀圖像

  • ALMeterResult
Field Type Nullable Description
result NSString ? 掃描過(guò)程的實(shí)際結(jié)果
image UIImage ? 掃描中裁剪的圖像
fullImage UIImage ? 完整的圖像
confidence NSInteger ? 掃描結(jié)果的準(zhǔn)確度
#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
    }];
}

一個(gè)完整的代碼:

//
//  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 @"你申請(qǐng)的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:@"結(jié)果" message:scanResult.result preferredStyle:QMUIAlertControllerStyleAlert];
    [alertController addAction:action1];
    [alertController showWithAnimated:YES];
    
}



@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汰寓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缠俺,更是在濱河造成了極大的恐慌显晶,老刑警劉巖贷岸,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異磷雇,居然都是意外死亡偿警,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門唯笙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)螟蒸,“玉大人,你說(shuō)我怎么就攤上這事崩掘∑呦樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵苞慢,是天一觀的道長(zhǎng)诵原。 經(jīng)常有香客問(wèn)我,道長(zhǎng)挽放,這世上最難降的妖魔是什么绍赛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮骂维,結(jié)果婚禮上惹资,老公的妹妹穿的比我還像新娘。我一直安慰自己航闺,他們只是感情好褪测,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著潦刃,像睡著了一般侮措。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乖杠,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天分扎,我揣著相機(jī)與錄音,去河邊找鬼胧洒。 笑死畏吓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卫漫。 我是一名探鬼主播菲饼,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼列赎!你這毒婦竟也來(lái)了宏悦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饼煞,沒(méi)想到半個(gè)月后源葫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砖瞧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年息堂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芭届。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡储矩,死狀恐怖感耙,靈堂內(nèi)的尸體忽然破棺而出褂乍,到底是詐尸還是另有隱情,我是刑警寧澤即硼,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布逃片,位于F島的核電站,受9級(jí)特大地震影響只酥,放射性物質(zhì)發(fā)生泄漏褥实。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一裂允、第九天 我趴在偏房一處隱蔽的房頂上張望损离。 院中可真熱鬧,春花似錦绝编、人聲如沸僻澎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窟勃。三九已至,卻和暖如春逗堵,著一層夾襖步出監(jiān)牢的瞬間秉氧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工蜒秤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汁咏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓作媚,卻偏偏與公主長(zhǎng)得像攘滩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掂骏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,101評(píng)論 1 32
  • 文/不問(wèn)天有涯 2018年5月16日轰驳,星期三,小雨。 落雨聲 哪親像一條歌级解,誰(shuí)知影 阮越頭嘸敢聽(tīng)異鄉(xiāng)的我 一個(gè)人起...
    不問(wèn)天有涯閱讀 599評(píng)論 2 6
  • 親愛(ài)的孩子們: 大家晚上好冒黑!此時(shí)的你們是不是已經(jīng)開(kāi)始背誦今天的內(nèi)容呢?剛才看了一下小打卡勤哗,張一菲抡爹、李念唐、...
    韋慧鴿閱讀 1,551評(píng)論 0 0
  • <1> 樊登老師講到芒划,有一次線下活動(dòng)中冬竟,一位讀者喊著“樊老師,樊老師民逼,謝謝你泵殴,謝謝你幫助了我,我聽(tīng)了你的書(shū)拼苍,我現(xiàn)在...
    大海HaishiC閱讀 637評(píng)論 3 2
  • 下午一時(shí)三十二分笑诅,她的疲憊還在夢(mèng)里大口大口地喘氣,一個(gè)響雷就把它拽回空氣里疮鲫。這座城正趁著秋未至緊抓著夏的尾巴吆你,搜刮...
    阿囈閱讀 875評(píng)論 2 6