DataMatrix识别及定位项目笔记(2)——基于QT+libdmtx-0.7.5的DataMatrix解码及定位

接上节内容,在项目上添加了读取图片并解码的程序,并且定位二维码位置;
基于qt和libdmtx库生成DataMatrix的工程,
DataMatrix开源的编码及识别库libdmtx的github:https://github.com/dmtx/libdmtx;
我用qt写的完整工程在:https://github.com/abcvincent/dmtxMaker;
github->doc中有DataMatrix国际标准文件和知乎的详解QR码的文档;
效果如下:

DataMatrix识别及定位项目笔记(2)——基于QT+libdmtx-0.7.5的DataMatrix解码及定位_第1张图片

其中红线标注的是二维码的L边;

先贴出libdmtx库里的例子:

 /* 3) DECODE the Data Matrix barcode from the copied image */

   img = dmtxImageCreate(pxl, width, height, DmtxPack24bppRGB);//创建dmtxImage
   assert(img != NULL);

   dec = dmtxDecodeCreate(img, 1);//解码img
   assert(dec != NULL);

   reg = dmtxRegionFindNext(dec, NULL);//查找下一个?
   if(reg != NULL) {
      msg = dmtxDecodeMatrixRegion(dec, reg, DmtxUndefined);//获取解码信息

      fprintf(stdout, "msg->arraySize :  \"%d\"\n", msg->arraySize );
      fprintf(stdout, "msg->codeSize  :  \"%d\"\n", msg->codeSize  );
      fprintf(stdout, "msg->outputSize:  \"%d\"\n", msg->outputSize);
      int oned = sqrt(msg->arraySize);//开方,求数据大小,然后把数据列输出来
      for (int i=0; iarraySize; i++){
         fprintf(stdout, " %c.", msg->array[i]);
         if (i%oned==oned-1){
            fprintf(stdout, "\n");
         }
      }
      fprintf(stdout, "\n\n");
      for (int j=0; jcodeSize; j++){
         fprintf(stdout, " %c.", msg->code[j]);
      }
      fprintf(stdout, "\n\n");
      for (int k=0; koutputSize; k++){
         fprintf(stdout, " %c.", msg->output[k]);
      }
      fprintf(stdout, "\n\n");

      if(msg != NULL) {
         fputs("output: \"", stdout);
         fwrite(msg->output, sizeof(unsigned char), msg->outputIdx, stdout);//读取信息并存储
         fputs("\"\n", stdout);//输出解码信息
         dmtxMessageDestroy(&msg);
      }
      dmtxRegionDestroy(®);
   }

   dmtxDecodeDestroy(&dec);
   dmtxImageDestroy(&img);
   free(pxl);

   fprintf(stdout, "%d\n", getSizeIdxFromSymbolDimension(12, 12));

qt使用的时候需要将图片转成 DmtxImage格式;

具体如下:

void dataMatrixDecode()
{
    //简化版本
    QTime time;
    QImage src("D:/1.jpg");//路径
    DmtxMessage *msg;
    DmtxRegion *reg;
    DmtxImage *imgdtx;
    QString outstr;

    time.start();//qt开始计时
    qDebug()<<"src.format() "<output << endl;//输出解码信息
                cout << msg->outputIdx << endl;

                //qt输出解码信息string->QString
                string strout = (char*)msg->output;//解码信息
                outstr=QString::fromStdString(strout);
                qDebug()<<"解码信息:"<output;//解码信息

                //二维码坐标信息
                qDebug()<<"reg->leftLine.locPos.X "<leftLine.locPos.X;
                qDebug()<<"reg->leftLine.locPos.Y "<leftLine.locPos.Y;
                qDebug()<<"reg->leftLine.locNeg.X "<leftLine.locNeg.X;
                qDebug()<<"reg->leftLine.locNeg.Y "<leftLine.locNeg.Y;
                qDebug()<<"bottomLine.locPos.X "<bottomLine.locPos.X;
                qDebug()<<"bottomLine.locPos.Y "<bottomLine.locPos.Y;
                qDebug()<<"bottomLine.locNeg.X "<bottomLine.locNeg.X;
                qDebug()<<"bottomLine.locNeg.y "<bottomLine.locNeg.Y;

                dmtxMessageDestroy(&msg);
            }
            else{qDebug()<<"无法检测到2";}
            dmtxRegionDestroy(®);
        }
        else{qDebug()<<"无法检测到1";}
    }
    dmtxDecodeDestroy(&dec);
    dmtxImageDestroy(&imgdtx);
    qDebug()<

原图如下:

DataMatrix识别及定位项目笔记(2)——基于QT+libdmtx-0.7.5的DataMatrix解码及定位_第2张图片

你可能感兴趣的:(项目笔记)