OpenCV+libdmtxでDataMatrixを読む
OpenCVのcv::Matデータをlibdmtxの処理に突っ込んで画像内のデータマトリックスを読む方法。
OpenCVにはcv::findDataMatrix()というDataMatrixを読む関数があるけど、なんか調べると3文字までしか読めないとか言われているので外部ライブラリを使用して使えるようにする。
・libdmtxのインストール(ubuntu16.04)
1. ターミナルで以下のコマンドを入力
$sudo apt-get install libdmtx-dev libdmtx-utils
2. /usr/lib/aarch64-linux-gnuの直下にlibdmtx.soがあることを確認。
(環境によって場所は変わるかも)
・Qtプロジェクトで使用する
1. 自分はQt creator使ってるんでプロジェクトファイルにライブラリを追加
LIBS += -L"/usr/lib/aarch64-linux-gnu" \
-ldmtx
2. dmtx.hをインクルード
#include <dmtx.h>
3. 以下のようなプログラムで使用できる。
QString decode( cv::Mat frame )
{
DmtxImage *img;
DmtxDecode *dec;
DmtxRegion *reg;
DmtxMessage *msg;
DmtxTime time;
QString result;
img = dmtxImageCreate( frame.data, frame.cols, frame.rows, DmtxPack24bppRGB );
dec = dmtxDecodeCreate( img, 1 );
time= dmtxTimeAdd( dmtxTimeNow(), 10 );
reg = dmtxRegionFindNext( dec, &time );
if( reg != NULL )
{
msg = dmtxDecodeMatrixRegion( dec, reg, -1 );
if( msg != NULL )
{
result = QString( reinterpret_cast<char*>(msg->output) );
dmtxMessageDestroy(&msg);
}
dmtxRegionDestroy(®);
}
dmtxDecodeDestroy(&dec);
dmtxImageDestroy(&img);
return result;
}