1
Help us understand the problem. What are the problem?

posted at

updated at

MLKitの一次元バーコード読み取り

MLKitの一次元バーコード読み取り

一次元バーコードを読み取るAndroidアプリでzxing-android-embeddedというライブラリを利用していましたが、ベースが旧CameraAPIだったためAndroid11などで動作しない問題があり、代わりにMLKitのバーコードスキャンAPIの利用を検討することにしました。

ユースケース

作りたいのはバーコードスキャナのイメージなのでバーコードを読み取った後、処理する予定なのでプレビューは停止させます。サンプルコードのようにリアルタイムでバーコードをマークしたままプレビューし続けるようなことはしません。

今回は試しにこのバーコードを読んでみます
IQOSレギュラーのバーコードですw
20220518_131724.jpg

うまく行った時

Screenshot_20220518-132246_sampleApp.jpg

誤検出した時

Screenshot_20220518-131634_sampleApp.jpg

後述するmlkitのサンプルコードではCameraX画像解析を利用してBarcodeScannerでバーコード検出しています。
しかし、オートフォーカスが動作中だったりスマホが動いていて画像がブレている状態でも処理してしまっているので、その場合に誤検出が起きることがあります。本当はCamera2APIのようにオートフォーカスのステータスを見てフォーカスロックされている時の画像を解析に回したいが、CameraXではフォーカスの状態が取れない?のでCamera2APIで置き換えた方が良いかもしれない。
また、BarcodeScannerでは
バーコードにはチェックデジットがあるにも関わらず、チェックデジットも正しく見えるような誤検出をしていました。

結論

MLKitのバーコードスキャナを利用するにあたり、一次元バーコードではカメラをゆらゆら動かし続けていると数十回に1回くらいの割合でチェックデジットも含めた絶妙な誤検出をしていた。
商用利用向けに開発するには、MLKitの検出結果にさらに各種バーコードの誤り検出の処理を組み合わせる必要がありそう。例えば、3フレームほど結果を保持しておいて全て同じ解析結果だったら検出として扱うような。
フレーム毎の検出結果の保持数を上げれば時間はかかるけど、精度は上がるといった仕組み。
ちなみにZxingは単一のバーコードしか解析できなさそう?なので、複数バーコードを一度に読み込みのはMLKitを使った方が良さそう。

参考

Scan Barcodes with ML Kit on Android

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?