1. 程式人生 > >iOS--AVFoundation原生二維碼與一維碼掃描

iOS--AVFoundation原生二維碼與一維碼掃描


概述

實現二維碼和條形碼掃描,兩大開源元件ZBar與ZXing
ZBar: 掃描靈敏性,記憶體較優,但“圓角二維碼”掃描比較困難。
ZXing: Google Code上的一個開源的條形碼掃描庫,是用java設計 而蘋果原生的AVFoundation掃描靈敏性和記憶體上最優,不過不相容iOS6及之前的版本。

支援一維碼掃描

一開始可以掃描二維碼,但不支援一維碼。

1). 新增metadataObjectTypes:AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code,

AVMetadataObjectTypeCode39Code

但是還是不支援掃描一維碼。

然後看了關於iOS原生條形碼掃描,你需要注意的兩三事  此文中提到“是在Detect Center那個點,畫一個無限延伸的米字型,然後去判斷每一條線上能否解析出條形碼所需要的0101010序列。而iOS預設的Center是 Layer 的 Center。提示給使用者的那個框,已經遠離了Center。所以我們豎著掃描的時候,那條水平的掃描線是沒有貫穿條形碼的,所以掃不上他。於是乎要根據裝置,iPhone4 iPhone5 通過AVCaptureDeviceFormat和AVCaptureSessionPreset 重新設定一下AVCaptureMetadataOutput rectOfInterest,結果問題就解決了。

但是,其實並沒有很懂, 怎麼通過AVCaptureDeviceFormat和AVCaptureSessionPreset重新設定AVCaptureMetadataOutput 的rectOfInterest也不明確。上網找了關於AVCaptureDeviceFormat和AVCaptureSessionPreset的相關資訊,但是還是不知道怎麼通過這兩個去設定rectOfInterest。而該文作者資訊判斷來自於蘋果的FAQ:

我去看了,FAQ中提到“the set of scan lines is expanded to cover a larger portion of the region of interest ("Additional")”, 在少數一些情況下掃描線會擴大到原始掃描區域之外,關於"Additional"的概念也不懂

所以我就上網找啊找 怎麼使用AVCaptureDeviceFormat和AVCaptureSessionPreset去設定rectOfInterest

。。。。然後就是沒有找到。

最後自己按照rectOfInterest的設定規則設定,然後可以掃描了。  大哭 

19th,March,2016

1. 設定識別區域RectOfInterest

識別區域預設是照相機捕獲的整張照片,可通過RectOfInterest配置識別區域提升掃描效能和速度,

Tip: CGRectMak(y, x, height, width) 值為0-1.0f,eg: 掃描區域.y/螢幕高度。 網上資料:AVCapture捕捉的圖片是橫著的,而手機是豎著的,所以需要旋轉90度。

"iOS上內建相機應用錄製的mov/mp4視訊可能產生一個Rotation元資料,表示錄製視訊時攝像頭旋轉到了多少角度。其值一般為這四個:0、90、180或270。

豎屏時rotation值為90.

橫批,Home鍵在右側時,Rotation=0."-- from [iOS]關於視訊方向的若干問題

2. 識別小圖SessionPreset屬性

該屬性可預設影象解析度, 決定照片中每一幀影象質量的大小:

AVCaptureSessionPresetPhoto/High/Medium/Low

AVCaptureSessionPreset320x240/352x288/640x480/960x540/1280x720/1920x1080/3840x2160

想要識別小圖則需要講該屬性設高一點,但相應的效率會比Low的低。

AVCaptureSessionPresetHight ==> iPhone5

一維碼與二維碼

一維碼:條碼的寬度儲存資料,有一組規則排序的條和空以及對應的字元組成,

          “條”(即使黑色的部分)光線反射率較低

     “空” (即白色的部分)光線發射率較高

而這些“條”和“空”組成的資料可以轉換成二進位制和十進位制的資訊。

二維碼:90年代發明了二維碼,主要分為兩種,一是堆疊式/行排式二維條碼。另一種就是現在普遍使用的矩陣式二維碼(Quick Response Code)擁有一維碼的優點同時,容錯性高,儲存資料量大。

未完待續。。。敬請期待。。。如有想法。。。歡迎交流

參考資料:

18th,March,2016

(題外話: 其實現在是拒絕寫部落格的,因為不想寫,但是還是寫吧) 一維碼和二位碼主要原理