Barcode Scanningは、モバイルデバイスのカメラを使ってバーコードを読み取り、デコードする技術です。専用機器を必要とするレーザースキャナーとは異なり、カメラベースのスキャナーはカメラ付きのあらゆるスマートフォンで動作します。モバイル開発では、Barcode ScanningはML Kit Barcode Scanning(Google)、AVFoundation(Apple)、ZXing(オープンソース)、またはScandit(商用SDK)を介して実装されます。Google ML Kit、2025によると、このライブラリは毎日20億以上のスキャンを98.5%の精度で処理しています。
重要ポイント
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-13 | 1D | 13桁 | 店舗商品 |
| QRコード | 2D | 4296文字 | リンク、支払い、チケット |
| Data Matrix | 2D | 2335文字 | 産業、医療 |
| PDF417 | 2D | 2710文字 | 書類、搭乗券 |
| Code 128 | 1D | 80文字 | 物流、運輸 |
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はAndroidアプリケーションの主要なSDKです。ML Kitは画像内のすべてのコードを自動的に検出します(コードが中央にある必要があるZXingとは異なります)。APIは、rawValue(テキスト内容)、format(コードタイプ)、boundingBox、cornerPoints(コードの4つの角のポイント)を含むBarcodeオブジェクトを返します。ML Kitはシングルスキャン(1フレーム)と連続スキャン(ビデオストリーム)をサポートしています。
マルチバーコードモード — ML Kitは1つの画像で複数のコードを検出できます。BarcodeScannerOptions.Builder()を介して有効にします。マルチモードではBarcodeのリストが返されます。在庫管理(商品バッチのスキャン)、テーブル上の複数のQRコード認識に使用します。マルチバーコードはデフォルトで無効になっています — 必要な場合のみ有効にしてください。スキャン速度が20~30%低下するためです。
// 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(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 Kit | ZXing |
|---|---|---|
| 精度 | 98.5% | 92% |
| 速度 | 15~30 ms | 50~150 ms |
| マルチコード | 対応 | 非対応 |
| Google Play | 必要 | 不要 |
| 隅のコード | 検出 | 非検出 |
ZXingを選ぶべき場合:アプリがHuaweiデバイス(Google Play Servicesなし)、Android Go(メモリ制限)で動作する必要がある場合、またはPlay Servicesなしで完全なオフライン動作が必要な場合。それ以外のすべてのケースでは、ML Kitの方が高速で正確、統合が容易で、マルチコードと端検出により優れたUXを提供します。
// 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は、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よりも設定が少ない — マルチバーコードや形式フィルタリングを有効にできません。
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は、小売、物流、ヘルスケアに特化した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%。
// 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を表示し、デコード成功時に緑色でハイライトしてください。
// 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の遅延が入ります。
よくある質問
ML Kit Barcode ScanningがAndroidに最適な選択肢です:無料、98.5%の精度、マルチコード、フレーム内の任意の場所で検出。アプリがGoogle PlayなしのHuaweiデバイスで動作する必要がある場合は、ZXing(オープンソース、低精度)を使用してください。エンタープライズ物流にはScandit(有料、99.5%の精度、SparkScan)を。シンプルなQRスキャナーにはZXingまたは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を使用してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。