アプリでのBarcode Scanning — コードの種類とML Kit

著者: IT Sectr 公開日: 2026-07-18 読了時間: 10 分

Barcode Scanningは、モバイルデバイスのカメラを使ってバーコードを読み取り、デコードする技術です。専用機器を必要とするレーザースキャナーとは異なり、カメラベースのスキャナーはカメラ付きのあらゆるスマートフォンで動作します。モバイル開発では、Barcode ScanningはML Kit Barcode Scanning(Google)、AVFoundation(Apple)、ZXing(オープンソース)、またはScandit(商用SDK)を介して実装されます。Google ML Kit、2025によると、このライブラリは毎日20億以上のスキャンを98.5%の精度で処理しています。

重要ポイント

  • Barcode Scanning — カメラで1Dおよび2Dコードを読み取り
  • ML Kit Barcode — 最も正確なSDK(98.5%)、マルチコード、全形式対応
  • 形式 — EAN、UPC、QR、Data Matrix、PDF417、Aztec、Code 128
  • リアルタイム — CameraXとAVFoundationで最大60 FPSのスキャン
  • オンデバイス — すべての処理をローカルで実行、インターネット不要

Barcode Scanningとは:原理と形式

Barcode Scanningは、カメラを使ってバーコードを光学的に認識するプロセスです。アルゴリズムが画像をキャプチャし、コードを見つけ(位置特定)、デコードし(データ抽出)、文字列値を返します。最新のSDKは、あらゆる向き、サイズ、照明条件のコードをスキャンできます。ユーザーはカメラを向けるだけで済みます。

バーコードの形式は2つのグループに分けられます。1D(線形)— EAN-13、UPC-A、Code 128、Code 39、ITF、Codabar — 最大20~30文字を含み、商品や物流に使用されます。2D(マトリックス)— QRコード、Data Matrix、PDF417、Aztec — 最大3000文字以上を含み、リンク、チケット、文書に使用されます。ML Kitは14の形式をサポートしています — 一般的な1Dおよび2Dの全形式です。

Data MatrixはQRに似た2Dコードですが、よりコンパクトです。産業(部品マーキング)、電子チケット(IATA BCBP)、医療サンプルで使用されます。Data Matrixは最大2335文字を格納でき、非常に小さな表面(2x2 mmまで)に印刷できます。QRとは異なり、Data Matrixにはファインダーパターン(角の正方形)がなく、より精密なカメラキャリブレーションが必要です。

形式タイプ最大データ用途
EAN-131D13桁店舗商品
QRコード2D4296文字リンク、支払い、チケット
Data Matrix2D2335文字産業、医療
PDF4172D2710文字書類、搭乗券
Code 1281D80文字物流、運輸

QRコードはモバイルアプリで最も人気のある2D形式です。URL、テキスト、vCard、WiFi設定、支払い情報(UPI、SBP)を含みます。QRコードには40のバージョン(21x21から177x177モジュール)と4つのエラー訂正レベル(L:7%、M:15%、Q:25%、H:30%)があります。モバイルアプリではバージョン2~10(25x25~57x57モジュール)を使用してください — サイズとデータの最適なバランスです。

ML Kit Barcode Scanning:統合と設定

ML Kit Barcode ScanningはAndroidアプリケーションの主要なSDKです。ML Kitは画像内のすべてのコードを自動的に検出します(コードが中央にある必要があるZXingとは異なります)。APIは、rawValue(テキスト内容)、format(コードタイプ)、boundingBox、cornerPoints(コードの4つの角のポイント)を含むBarcodeオブジェクトを返します。ML Kitはシングルスキャン(1フレーム)と連続スキャン(ビデオストリーム)をサポートしています。

マルチバーコードモード — ML Kitは1つの画像で複数のコードを検出できます。BarcodeScannerOptions.Builder()を介して有効にします。マルチモードではBarcodeのリストが返されます。在庫管理(商品バッチのスキャン)、テーブル上の複数のQRコード認識に使用します。マルチバーコードはデフォルトで無効になっています — 必要な場合のみ有効にしてください。スキャン速度が20~30%低下するためです。

kotlin
// ML Kit Barcode Scanning multi-code mode
val options = BarcodeScannerOptions.Builder()
    .setBarcodeFormats(
        Barcode.FORMAT_QR_CODE,
        Barcode.FORMAT_EAN_13,
        Barcode.FORMAT_DATA_MATRIX
    )
    .enableAllPotentialBarcodes()
    .build()
val scanner = BarcodeScanning.getClient(options)

scanner.process(inputImage)
    .addOnSuccessListener { barcodes ->
        barcodes.forEach { barcode ->
            val type = barcode.valueType // URL, TEXT, PHONE...
            val rawValue = barcode.rawValue
            val displayValue = barcode.displayValue
        }
    }

形式フィルタリング — 必須の最適化です。setBarcodeFormats()はML Kitが検索する形式を制限します。アプリがQRコードのみをスキャンする場合は、FORMAT_QR_CODEを指定してください。これにより、他の形式のデコードアルゴリズムを除外してスキャン速度が2~3倍向上します。小売スキャナーの場合 — FORMAT_EAN_13 | FORMAT_UPC_A。物流の場合 — FORMAT_CODE_128 | FORMAT_CODE_39 | FORMAT_PDF417。

ZXing vs ML Kit:ライブラリ比較

ZXing(Zebra Crossing)はJava(Android)のオープンソースライブラリで、Swift、React Native、Flutterへの移植版があります。ZXingはML Kit登場前の事実上のスキャン標準でした。すべての人気形式をサポートし、あらゆるデバイス(Google PlayなしのHuaweiを含む)で動作し、Google Play Servicesを必要としません。欠点:ML Kitより2~3倍遅い、フレームの端でコードを検出できない、マルチバーコード非対応。

ML Kit vs ZXing — ML Kitは速度、精度、UXで優れています。ML Kitはコードがフレームの10%しか占めておらず、隅にある場合でも検出します。ZXingはコードがフレームの50~80%を占め、中央にある必要があります。ML Kitはニューラルネットワーク(MobileNetV2-SSD)を使用してコードを位置特定し、ZXingは古典的な2値化とファインダーパターン検索を使用します。Google(2025)によると、ML Kitは98.5%の精度を達成しており、ZXingの92%を上回っています。

特性ML KitZXing
精度98.5%92%
速度15~30 ms50~150 ms
マルチコード対応非対応
Google Play必要不要
隅のコード検出非検出

ZXingを選ぶべき場合:アプリがHuaweiデバイス(Google Play Servicesなし)、Android Go(メモリ制限)で動作する必要がある場合、またはPlay Servicesなしで完全なオフライン動作が必要な場合。それ以外のすべてのケースでは、ML Kitの方が高速で正確、統合が容易で、マルチコードと端検出により優れたUXを提供します。

kotlin
// ZXing Core: simple scanner
val reader = MultiFormatReader()
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.test)
val source = RGBLuminanceSource(bitmap)
val binarizer = HybridBinarizer(source)
val binaryBitmap = BinaryBitmap(binarizer)

try {
    val result = reader.decode(binaryBitmap)
    Log.d("ZXing", result.text)
} catch (e: NotFoundException) {
    // Code not found
}

代替としてのScandit — 99.5%の精度と10~20 msの速度を備えた商用SDK。独自のニューラルネットワークを使用し、Google Play Servicesを必要としません。価格 — 月額400ドルから(2019年)。Scanditは小売と物流(Walmart、FedEx)で支配的です。ほとんどのモバイルアプリにはML Kitで十分です。Scanditは高ボリュームスキャンを伴うエンタープライズタスクにのみ正当化されます。

Apple AVFoundation:iOSのネイティブスキャナー

Apple AVFoundationは、AVCaptureMetadataOutputを介してネイティブのBarcode Scanningを提供します。iOS 7以降、AVFoundationはQRコードスキャンをサポートし、iOS 8以降はEAN、UPC、Code 128、PDF417のすべての形式をサポートしています。AVFoundationは追加のSDKを必要としません — Foundationの一部です。スキャンはA12+のApple Neural Engineを介して動作し、速度は10~20 msで、最小限の電力消費です。

AVFoundationの利点:ゼロ依存、自動カメラ向き処理、ライト/ダークモードの組み込みサポート、バックグラウンド動作(background modes)。AVFoundationはスキャン用にオートフォーカスと露出を自動調整します。開発者はcaptureOutputデリゲートにサブスクライブするだけです。欠点:ML Kitよりも設定が少ない — マルチバーコードや形式フィルタリングを有効にできません。

swift
import AVFoundation

class BarcodeScannerController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
    private var captureSession: AVCaptureSession!

    override func viewDidLoad() {
        let metadataOutput = AVCaptureMetadataOutput()
        captureSession.addOutput(metadataOutput)
        metadataOutput.setMetadataObjectsDelegate(self, queue: .main)
        metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128]
    }

    func metadataOutput(_ output: AVCaptureMetadataOutput,
                         didOutput objects: [AVMetadataObject],
                         from connection: AVCaptureConnection) {
        guard let code = objects.first as? AVMetadataMachineReadableCodeObject else { return }
        print(code.stringValue ?? "")
    }
}

iOSでのML Kit vs AVFoundation:ML Kitはより多くの制御を提供します — 形式の設定、マルチバーコードの有効化、信頼度によるコードのフィルタリングが可能です。AVFoundationは古いデバイスで高速ですが(オーバーヘッドが少ない)、iOS 15未満ではData Matrix、Aztec、PDF417をサポートしていません。iOS 15以降ではML Kitが推奨されます。iOS 12~14では、AVFoundation + 非サポート形式に対するML Kitへのフォールバックを使用してください。

Scandit:エンタープライズ向け商用ソリューション

Scanditは、小売、物流、ヘルスケアに特化したBarcode Scanning用の商用SDKです。Scanditは、まぶしさ、損傷、低照度、最大45度の傾き、反射など、さまざまな条件下で1000万以上のバーコード画像でトレーニングされた独自のニューラルネットワークを使用しています。Scanditは最大15メートルの距離(倉庫内のPDF417の場合)および湾曲した表面(缶、ボトル)のコードをスキャンできます。

Scanditの機能:SparkScan(高速シーケンシャルスキャンのためのシングルスキャン)、MatrixScan(マルチバーコード + スキャンアイテムのARハイライト)、PickList(確認付きバーコードによる商品検索)。ScanditはGS1 DataBarやComposite Codesを含む50以上の形式をサポートしています。速度 — コードあたり10~15 ms。精度 — 標準照明で99.5%、低照度で97%。

kotlin
// Scandit MatrixScan (SDK license required)
val barcodeTracking = BarcodeTracking
    .forDataCaptureContext(context)
    .addListener(this)
    .build()
barcodeTracking.addSessionListener { session, _ ->
    session.trackedBarcodes.forEach { (trackingId, barcode) ->
        val data = barcode.data
        val symbolCount = barcode.symbolCount
    }
}

Scandit vs ML Kit:Scanditは有料(月額400ドル以上)ですが、エンタープライズ機能を提供します:SparkScan(企業デバイスのハードウェアボタン)、MatrixScan(ハイライト用ARオーバーレイ)、PickList(音声確認)。ML Kitは無料で、90%のモバイルアプリ(店舗スキャナー、QRリーダー、チケットアプリ)に十分です。ScanditはZebra/Honeywellデバイスを使用する物流端末にのみ正当化されます。

スキャン最適化:速度と精度

Barcode Scanningの最適化には、カメラ、解像度、SDKの設定が含まれます。基本ルール:ピクセル数が少ないほどスキャンが高速になります。ML Kitの最適解像度は、動画で480p(640x480)、写真で720p(1280x720)です。1080pに上げると、精度が向上することなく処理速度が2~3倍低下します。自動解像度管理にはImageAnalysisを備えたCameraXを使用してください。

フォーカスと露出はスキャン品質に重要です。ML Kitはカメラを自動設定しません — 開発者はCamera2またはCameraXを介してコンティニュアスオートフォーカスとコンティニュアスオート露出を有効にする必要があります。オートフォーカスがないと、ぼやけたコードは精度が60~70%に低下します。近距離スキャン(5~15 cm)では、利用可能な場合はカメラのマクロモードを使用してください。

オートズームとファインダーオーバーレイ — ユーザーUXの改善。オートズームはコードが検出されたときに拡大します(Google Lensカメラのように)。コードのboundingBoxを分析し、プレビューをスケーリングすることで実装します。ファインダーオーバーレイは、カメラを向ける場所を示すグラフィカルフレームです。最良のUXのために、見つかったコードのboundingBoxを表示し、デコード成功時に緑色でハイライトしてください。

kotlin
// CameraX + ML Kit: optimized scanner
class BarcodeAnalyzer(private val scanner: BarcodeScanner) :
    ImageAnalysis.Analyzer {

    override fun analyze(image: ImageProxy) {
        if (image.image == null) { image.close(); return }
        val mediaImage = InputImage.fromMediaImage(image.image, image.imageInfo.rotationDegrees)
        scanner.process(mediaImage)
            .addOnSuccessListener { barcodes ->
                barcodes.firstOrNull()?.let {
                    // Haptic + sound + code highlight
                }
            }
            .addOnCompleteListener { image.close() }
    }
}

ユーザーへのフィードバック:振動(HapticFeedback)、音(MediaActionSound)、視覚的ハイライト(Canvas/Overlay)。スキャン成功後、次のスキャンまでに1000~1500 msの遅延(スロットリング)を追加してください — これにより同じコードでの重複トリガーを防止します。シーケンシャルスキャン(バッチスキャン)では、SparkScanアプローチを使用してください。各スキャンが記録・通知され、300~500 msの遅延が入ります。

よくある質問

Androidでのバーコードスキャンに最適なSDKは?

ML Kit Barcode ScanningがAndroidに最適な選択肢です:無料、98.5%の精度、マルチコード、フレーム内の任意の場所で検出。アプリがGoogle PlayなしのHuaweiデバイスで動作する必要がある場合は、ZXing(オープンソース、低精度)を使用してください。エンタープライズ物流にはScandit(有料、99.5%の精度、SparkScan)を。シンプルなQRスキャナーにはZXingまたはML Kitで十分です。

ML Kitはどのバーコード形式をサポートしていますか?

ML Kit Barcode Scanningは14の形式をサポートしています:1D — EAN-8、EAN-13、UPC-A、UPC-E、Code 39、Code 93、Code 128、ITF、Codabar;2D — QRコード、Data Matrix、PDF417、Aztec。GS1 DataBar(RSS-14、RSS-Expanded)もサポートされています。完全なリストはBarcode.FORMAT_*のドキュメントにあります。形式を制限するにはsetBarcodeFormats()を使用してください — これによりスキャン速度が2~3倍向上します。

バーコードスキャンを高速化するには?

カメラ解像度を480p(640x480)に下げ、コンティニュアスオートフォーカスを有効にし、必要な形式のみに制限し(setBarcodeFormats)、FASTパフォーマンスモードを使用します。ML Kitでは必要な形式のみを指定してください — 余分な形式を除外するとスキャン速度が2~3倍向上します。ZXingではGlobalHistogramBinarizerの代わりにHybridBinarizerを使用してください(20%高速)。AVFoundationではmetadataObjectTypesを指定してください。

バーコードスキャンはインターネットなしで動作しますか?

はい、すべてのローカルBarcode Scanning SDK(ML Kit、ZXing、AVFoundation、Scandit)は完全にオフラインで動作します。ML Kitはモデルの初回ダウンロード時のみインターネットが必要です(ダウンロードモード)。その後モデルはデバイスにキャッシュされます。AVFoundationはiOSに組み込まれており、インターネットは不要です。ZXingはPlay Servicesなしで完全にオフラインです。クラウドスキャン(Google Cloud Vision)はモバイルアプリでは使用されません。

損傷したバーコードやぼやけたバーコードはスキャンできますか?

ML KitとScanditには、ニューラルネットワークアルゴリズムにより、損傷したコードの補正機能が組み込まれています。ML Kitは損傷したコード(傷、破れ)の最大30%を復元します。Scanditは欠陥コードでのトレーニングにより最大50%を復元します。ZXingは損傷したコードを実質的に復元しません — 鮮明な画像が必要です。欠陥コードのスキャンには、ACCURATEパフォーマンスモードのScanditまたはML Kitを使用してください。

まとめ

  • Barcode Scanning — スマートフォンカメラによる1D/2Dコードの検出とデコード
  • ML Kit — 98.5%の精度、マルチコード、フレーム内どこでも検出、無料
  • ZXing — オープンソース、あらゆるデバイスと互換性、92%の精度
  • AVFoundation — ネイティブiOSスキャナー、システムに組み込み(iOS 7+)
  • Scandit — エンタープライズSDK(99.5%)、SparkScan、MatrixScan、月額400ドルから
  • 最適化 — 480p解像度、オートフォーカス、形式制限、ハプティックフィードバック
  • 全形式 — EAN、UPC、QR、Data Matrix、PDF417、Aztec、Code 128

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください