MLKitの一次元バーコード読み取り
一次元バーコードを読み取るAndroidアプリでzxing-android-embeddedというライブラリを利用していましたが、ベースが旧CameraAPIだったためAndroid11などで動作しない問題があり、代わりにMLKitのバーコードスキャンAPIの利用を検討することにしました。
ユースケース
作りたいのはバーコードスキャナのイメージなのでバーコードを読み取った後、処理する予定なのでプレビューは停止させます。サンプルコードのようにリアルタイムでバーコードをマークしたままプレビューし続けるようなことはしません。
今回は試しにこのバーコードを読んでみます
IQOSレギュラーのバーコードですw
うまく行った時
誤検出した時
後述するmlkitのサンプルコードではCameraXと画像解析を利用してBarcodeScannerでバーコード検出しています。
しかし、オートフォーカスが動作中だったりスマホが動いていて画像がブレている状態でも処理してしまっているので、その場合に誤検出が起きることがあります。本当はCamera2APIのようにオートフォーカスのステータスを見てフォーカスロックされている時の画像を解析に回したいが、CameraXではフォーカスの状態が取れない?のでCamera2APIで置き換えた方が良いかもしれない。
また、BarcodeScannerでは
バーコードにはチェックデジットがあるにも関わらず、チェックデジットも正しく見えるような誤検出をしていました。
結論
MLKitのバーコードスキャナを利用するにあたり、一次元バーコードではカメラをゆらゆら動かし続けていると数十回に1回くらいの割合でチェックデジットも含めた絶妙な誤検出をしていた。
商用利用向けに開発するには、MLKitの検出結果にさらに各種バーコードの誤り検出の処理を組み合わせる必要がありそう。例えば、3フレームほど結果を保持しておいて全て同じ解析結果だったら検出として扱うような。
フレーム毎の検出結果の保持数を上げれば時間はかかるけど、精度は上がるといった仕組み。
ちなみにZxingは単一のバーコードしか解析できなさそう?なので、複数バーコードを一度に読み込みのはMLKitを使った方が良さそう。
参考
Scan Barcodes with ML Kit on Android