QR Code Decode C++ with qrdec.

QR Code Decode C++ with qrdec.

qrdec というのがあったので、試してみました。
quirc より少し重いけど、性能は良いみたいぞね。

開発環境
Ubuntu Mate 22.04 PC

1. git clone
$ cd ~/Documents/VisualStudio-CPP/
$ git clonehttps://github.com/torque/qrdec.git
$ cd qrdec

2. オリジナルのテストプログラムのビルド。
$ make test
/usr/bin/ld: -liconv が見つかりません: そのようなファイルやディレクトリはありません
と怒られた。
libghc-iconv-doc が必要か?
$ sudo apt install libghc-iconv-doc
違うみたい。
$ sudo apt remove --purge libghc-iconv-dev
$ sudo apt autoremove
判らん。
glibc の中に元からあるみたい。
[Build] Build failed due to undefined reference to libiconv #15560
gcc or clang++ みたい。

Makefile が問題みたい。
#TEST_LDFLAGS = $(LDFLAGS) $(shell pkg-config --libs libpng) -liconv $(LIBRARY) -fPIE
TEST_LDFLAGS = $(LDFLAGS) $(shell pkg-config --libs libpng) $(LIBRARY) -fPIE

$ make clean
$ make test
build/qrdec ができた。
実行は、
$ build/qrdec 画像ファイル
ですが、テスト画像は、下記にあります。
mchehab/zbar/examples
qr-code.png


3. build library

$ make clean
$ make production
build/libqrdec.a が出来る。

4. おんちゃんのテストプログラムをビルド。

$ mkdir qrdec_reader-nishi
$ cd qrdec_reader-nishi
この下に、reader.c を参考に、 OpenCV を使った、reader.cc を作ります。
あと、reader.c, image.c, image.h は、ライブラリー外のソースとのことです。
上記、3 ファイルをコピーします。
reader.c を reader.cc に rename して、opencv の処理を組み込みます。

reader.cc


4.1 CMakeLists.txt を用意する。

CMakeLists.txt


4.2 ビルド。
$ mkdir build
$ cd build
$ cmake ..
$ make

4.3 実行
実行は、
./reader image-file
ですが、テスト画像は、下記にあります。
mchehab/zbar/examples
qr-code.png

5. 補足。
5.1 qrdec/Makfile で、オリジナルの all: debug でビルドすると。

$ make


になって、 Memory Leak チェックが使われるようです。
clang/gccに組み込まれたAddressSanitizer/LeakSanitizerでメモリエラーを捕捉する

これを知らないで、reader.cc を普通にビルドすると、リンクエラーがでます。


undefined reference to '_asan_init_v4' when compiling

この場合は、CMakeflie.txt に下記を追加します。


5.2 使ってみて、
Tensoflow Lite の Object detection C++ を、 QR Code の検出モデルを使って、QR コードを検出してから、その検出部分の画像を、
quirc と 今回の、qrdec で試してみましたが、
ちょっとだけ、qrdec のデコードの性能が良いようです。
注) quirc, qrdec 単体でも、検索 and デコードは、出来る。
ちなみに、zbar も QR Code のデコードは、qrdec のようです。
ただし、zbar は、バーコードにも対応しているみたい。

5.3 上記 Memory Leak check有りでビルドして、
Opencv の cv::imshow()、cv::waitKey(1) で、ループさせると、

while(1){
   cap >> frame;
   ...
   cv::imshow(WINNAME, frame);
   key = cv::waitKey(1);

下記、メモリーリークが生じます。


1回だけだと、OK で、
また ループさせても cv::waitKey(1) がなければ、OKだと言う人もいる。
しかし、cv::waitKey(1) が無いと、表示されないのだが。
普通に繰り返すと、Memory leak が生じるみたい。

結構多くの者が、OpenCV にトラブルを上げているようだが、理解が無いみたい。
利用者側の問題と、言い続けているようだ。

このブログ記事について

このページは、おんちゃんが2024年1月10日 12:59に書いたブログ記事です。

ひとつ前のブログ記事は「Coral Edge TPU Image Classification C++」です。

次のブログ記事は「ESP-EYE QR Code Scanner with qrdec. 」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ