[iOS] AVFoundation(AVCaptureMetadataOutput)でバーコードリーダーを作ってみた

2017.01.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

本記事は、AVFoundationを使用しのバーコードの読み取りを紹介するものです。

AVFoundationを使用する場合の共通的な処理については下記に纏めましたので、是非、ご参照下さい。
[iOS] AVFundationを使用して、「ビデオ録画」や「連写カメラ」や「QRコードリーダー」や「バーコードリーダー」を作ってみた

バーコードの規格も多数存在していますが、日本では、標準タイプ(13桁)と短縮タイプ(8桁)の2種類が主に利用されているようです。 本記事のサンプルでは、この2つを検出するため、対象のメタデータタイプをAVMetadataObjectTypeEAN13Code及び、AVMetadataObjectTypeEAN8Codeに設定しています。

2 入出力

QRコードの読み取りを実装する場合、入力として、カメラ(今回は背面)を使用し、出力として、メタデータであるAVCaptureMetadataOutputを設定します。

001

下記のコードは、セッションを生成して、上記のとおり入出力をセットしている例です。

<br />// セッションのインスタンス生成
let captureSession = AVCaptureSession()

// 入力(背面カメラ)
let videoDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
let videoInput = try! AVCaptureDeviceInput.init(device: videoDevice)
captureSession.addInput(videoInput)

// 出力(メタデータ)
let metadataOutput = AVCaptureMetadataOutput()
captureSession.addOutput(metadataOutput)

3 AVCaptureMetadataOutput

delegateの設定及びmetadataObjectTypesの扱いに付いては、QRで紹介したとおり。

// メタデータを検出した際のデリゲート設定
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
// EAN-13コードの認識を設定
metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code]

QRコードの読み込みでは、メタデータの検出エリアを取得して枠を表示しましたが、今回は、検出範囲を設定して、その中にターゲットが入ったときだけ検出するようにしてみました。

002 003

なお、検出エリアの設定は、ビュー全体対する比率を0〜1.0の範囲で表します。

let x: CGFloat = 0.05
let y: CGFloat = 0.3
let width: CGFloat = 0.9
let height: CGFloat = 0.2

// 検出エリアの設定
metadataOutput.rectOfInterest = CGRect(x: y,y: 1-x-width,width: height,height: width)

サンプルでは、同じ比率を使用して、検出エリアの枠を表示しています。

detectionArea.frame = CGRect(x: view.frame.size.width * x, y: view.frame.size.height * y, width: view.frame.size.width * width, height: view.frame.size.height * height)
detectionArea.layer.borderColor = UIColor.red.cgColor
detectionArea.layer.borderWidth = 3

4 動作確認

実際に動作している様子です。

5 最後に

コードは下記に置いています。気になるところが有りましたら、ぜひ教えてやってください。
github [GitHub] https://github.com/furuya02/AVCaptureMetadataOutputSample_EAN13CodeReader

アイコンは、下記のものを利用させて頂きました。
http://jp.freepik.com/

6 参考資料


API Reference AVCaptureMetadataOutput
[iOS] AVFundationを使用して、「ビデオ録画」や「連写カメラ」や「QRコードリーダー」や「バーコードリーダー」を作ってみた