1 dmlocation()中的dmDecode()
二维码解码的过程,即识别二维码。
Datamatrix是由深浅排列规则的正方形小块构成,每一个正方形模块都是一个基本单元,每个基本单元又被编码成为比特数据,数据区域四周是探测图形,用于条码符号定位和确定条码信息。探测图形四周是空白区,用以将条码和背景分离。
探测图形 ,是一个模块的宽度,是数据区域的边界,其中全部由深色模块组成的两条邻边是一个 “L” 的形状,==“L”==的两条对边是由深浅两种基本单元构成的虚线边缘。探测图形主要用于限定符号的单元结构,也可用于确定符号的物理尺寸,以及解决符号定位和失真等问题。
数据区域,被探测图形所包围,位于探测图形的内部,通过基本单元的深浅(1,0)来表示,深色基本单元为“1”,浅色基本单元为“0”,通过制定规则的编码方式,构成data Matrix条码。
因此一个data Matrix可以说是由四个部分组成:
- 探测图形的“L”边缘;
- “L”边缘的对边,由深浅基本单元构成的虚线边缘;
- 探测图形内部的,数据区域;
- 条码四周一个模块宽度的空白区域。
Data Matrix编码包括三个部分:
- 是将数据信息流通过最优的编码规则转换成数据码字;
- 是根据Reed-Solomon算法以及响应的纠错要求,在数据码字的基础上生成纠错码字,数据码字加上纠错码字及可能需要的若干填充字符,构成编码后的码字流;
- 是将按照标准模板将单元模块放置到矩阵中,并加入探测图形,生成Data Matrix二维矩阵码符号。
Data Matrix二维条码图像的识别主要包括:图像预处理、条码定位、采样解码。
Data Matrix条码图像预处理:
- 对采集到的彩色图像灰度化;
- 对灰度图像进行滤波去噪;
- 选取适当的阈值进行图像二值化;
- 最后进行边缘提取。
条码定位:
- 区域初定位;
- 边缘检测;
- 旋转校正;
- 精确提取;
- 条码分割(网格)。
Data Matrix条码解码识别:根据采样网格,将深浅模块转换为“1”、“0”矩阵;去除探测图形,提取出数据区,并得到条码尺寸和版本信息;调用模块放置矩阵恢复正确顺序的码字流;再确定数据码字和纠错码字,并进行条码数据的检错纠错;最终恢复原始数据,正确解码输出。
PosGuide::dmDecod(Mat _srcImg, //输入图片矩阵
int& _dmValue, //存储dataMatrix中的去除多余数据的数据
int& _controlMode, //控制模型的解码结果
vector<Point2f>& _dmPoints) //二维码的四周边角点坐标
2 C++中的new
C++编程语言中定义了两个运算符可以动态的分配和删除内存空间,分别是new和delete。
new && delete都比智能指针更加容易出错,在编程时尽量使用智能指针
2.1 使用new来动态分配内存或者初始化对象
是用new时,会返回一个指向这个对象分贝空间的指针。
int *p1 = new int; //p1 指向一个没有命名没有初始化的动态空间
对于整型数据的初始化和字符型的数据的初始化是不同的。
举个栗子:
int *p1 = new int; //p1指针指向一个未命名未初始化的int数据动态空间
int *p2 = new int(); //p2指针指向一个未命名初始化为0的int数据动态空间
int *p1 = new int(1024); //p3指针指向一个未命名初始化为1024的int数据动态空间
string *p4 = new string; //p4指针指向一个未命名初始化为空字符的string数据空间
string *p5 = new string(); //p5指针指向一个未命名初始化为空字符的string数据空间
string *p6 = new string(4,'9'); //p6指针指向一个未命名初始化为'9999'的string数据空间
vector<int> *p7 = new vector<int>{0,1,2,3,4,5};//p7指针指向一个未命名有6个元素,初始化为0-5的向量空间
也可以通过 “auto”让编译器自动检测,初始化的值要放在括号中,我们可以通过auto自动探测我们需要分配空间的数据类型,但是因为编译器通过括号中的初始化值的类型自动检测数据分配的数据类型,因此初始化的值只能有一个。
举个栗子:
auto pv = new auto(object); //pv指针指向一个未命名,初始化值为object的object类型存储空间
auto pv2 = new auto{a,b,c}; //ERR
2.2 动态分配const对象
const int *p1 = new const int; //ERR,const必须要初始化
const int *p2 = new const int(1024);
const string *p3 = new const string;
3 dmDecode()的流程
举个栗子:
zxing::Ref<zxing::LuminanceSource> source = MatSource::create(_srcImg); //获得要解码的二维码图片
zxing::Ref<zxing::Reader> reader;
reader.reset(new zxing::datamatrix::DataMatrixReader);
zxing::Ref<zxing::Binarizer> binarizer(new zxing::GlobalHistogramBinarizer(source));
zxing::Ref<zxing::BinaryBitmap> bitmap(new zxing::BinaryBitmap(binarizer));
zxing::Ref<zxing::Result> result(reader->decode(bitmap, zxing::DecodeHints(zxing::DecodeHints::DATA_MATRIX_HINT))); //解码
string str=result->getText()->getText(); //获得二维码的内容
至此,二维码的内容已经完全读取出来了,需要针对个人需求对于读取的数据处理。
3.1 zxing-cpp中的Result::getResultPoints()
与图像中条码相关的点。这些通常时识别取景器团伙条码角落的点。确切的含义与条码类型有关。
3.2 zxing-cpp中的Result::getText()
条码解码后的原始文本。