$search
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 //dmtxImageSetProp(img, DmtxPropImageFlip, DmtxFlipY); 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 }