メニューを閉じる

テクノデジタルグループ

メニューを開く

2019.10.30

プログラミング

AndroidのQRコードリーダーSDKはzxingよりOpenCV4が精度いい

坂東です。

既存アプリにQRコードリーダー機能を追加するにあたり定番のzxingを使ったんですけれど、

QRコードの読取、生成をする [Android]
https://qiita.com/hoshiume11/items/0f496fe80df84875c132

妙に読み取り精度が悪いんです。
カメラに近づきすぎても離れすぎても駄目で、30cm〜40cmぐらいの距離じゃないと認識しない。

 

いままでzxing使ってて別に支障なかったけどなあ、と思って気づいた今回は使うのはフロントカメラ。
いままではリアのメインカメラを使うのばかりでした。

 

リアカメラはまあメインなのでオートフォーカスがあったり画質が良かったりレンズが3つあったりします。
フロントカメラは自撮り用途なので機能的に大きく劣りオートフォーカスもなかったりする機種が多いです。

zxingはどうもオートフォーカス前提の実装で距離にシビアなんじゃないかなと。

 

zxingに食わせる前に画像加工しなきゃだめか。
OpenCVいれるかー、と思ったら最近のOpenCVにはQRコード読み取り機能がついてるんですね。

cv::QRCodeDetector Class Reference
https://docs.opencv.org/4.0.0/de/dc3/classcv_1_1QRCodeDetector.html

さっそく実装。すぐできた。

カメラで読ませるなら、だいたいこんなかんじ。

override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame): Mat {
  val detector = QRCodeDetector()
  val data = detector?.detectAndDecode (inputFrame.rgba())
  if (data != null && data?.length > 0) {
    runOnUiThread {
      Toast.makeText(getApplicationContext(), data, Toast.LENGTH_LONG).show()
    }
  }
  return inputFrame.rgba()
}

 

認識精度は大幅に向上しました。
でもOpenCVライブラリってでかいからapkが50MBぐらい増える。
まあ内部用アプリなのでいいけど公開するなら考えちゃいますね。

 

こちらで色々説明してくれてます。

QRコード検出APIの解説

https://qiita.com/tomoaki_teshima/items/f136e51fa1da6927471b

 

おわり。


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事