Go to the documentation of this file.00001 #include "detector.h"
00002 #include <dmtx.h>
00003
00004 namespace detectors{
00005 namespace datamatrix{
00006 Detector::Detector(){
00007 }
00008
00009 bool Detector::detect(cv::Mat& image, int timeout, unsigned int offsetx, unsigned int offsety){
00010 bool detected = false;
00011 lines_.clear();
00012 message_.clear();
00013 polygon_.clear();
00014 DmtxRegion *reg;
00015 DmtxDecode *dec;
00016 DmtxImage *img;
00017 DmtxMessage *msg;
00018 DmtxTime t;
00019
00020 img = dmtxImageCreate(image.data, image.cols, image.rows, DmtxPack24bppRGB);
00021
00022
00023 dec = dmtxDecodeCreate(img, 1);
00024 assert(dec != NULL);
00025
00026 t = dmtxTimeAdd(dmtxTimeNow(), timeout);
00027 reg = dmtxRegionFindNext(dec, &t);
00028
00029 if(reg != NULL) {
00030
00031 int height;
00032 int dataWordLength;
00033 int rotateInt;
00034 double rotate;
00035 DmtxVector2 p00, p10, p11, p01;
00036
00037 height = dmtxDecodeGetProp(dec, DmtxPropHeight);
00038
00039 p00.X = p00.Y = p10.Y = p01.X = 0.0;
00040 p10.X = p01.Y = p11.X = p11.Y = 1.0;
00041 dmtxMatrix3VMultiplyBy(&p00, reg->fit2raw);
00042 dmtxMatrix3VMultiplyBy(&p10, reg->fit2raw);
00043 dmtxMatrix3VMultiplyBy(&p11, reg->fit2raw);
00044 dmtxMatrix3VMultiplyBy(&p01, reg->fit2raw);
00045 polygon_.push_back(cv::Point(p00.X + offsetx,image.rows-p00.Y + offsety));
00046 polygon_.push_back(cv::Point(p10.X + offsetx,image.rows-p10.Y + offsety));
00047 polygon_.push_back(cv::Point(p11.X + offsetx,image.rows-p11.Y + offsety));
00048 polygon_.push_back(cv::Point(p01.X + offsetx,image.rows-p01.Y + offsety));
00049
00050 lines_.push_back(
00051 std::pair<cv::Point,cv::Point>(
00052 cv::Point(p00.X + offsetx,image.rows-p00.Y + offsety),
00053 cv::Point(p10.X + offsetx,image.rows-p10.Y + offsety)
00054 )
00055 );
00056 lines_.push_back(
00057 std::pair<cv::Point,cv::Point>(
00058 cv::Point(p10.X + offsetx,image.rows-p10.Y + offsety),
00059 cv::Point(p11.X + offsetx,image.rows-p11.Y + offsety)
00060 )
00061 );
00062 lines_.push_back(
00063 std::pair<cv::Point,cv::Point>(
00064 cv::Point(p11.X + offsetx,image.rows-p11.Y + offsety),
00065 cv::Point(p01.X + offsetx,image.rows-p01.Y + offsety)
00066 )
00067 );
00068 lines_.push_back(
00069 std::pair<cv::Point,cv::Point>(
00070 cv::Point(p01.X + offsetx,image.rows-p01.Y + offsety),
00071 cv::Point(p00.X + offsetx,image.rows-p00.Y + offsety)
00072 )
00073 );
00074 detected = true;
00075 msg = dmtxDecodeMatrixRegion(dec, reg, DmtxUndefined);
00076 if(msg != NULL) {
00077 message_ = (const char*)msg->output;
00078 dmtxMessageDestroy(&msg);
00079 }
00080 dmtxRegionDestroy(®);
00081 }
00082
00083 dmtxDecodeDestroy(&dec);
00084 dmtxImageDestroy(&img);
00085 return detected;
00086 }
00087 }
00088 }