二维码Data Matrix简单介绍及在VS2010中的编译
Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明。Data-Matrix二维条码是一种矩阵式二维条码。
Data Matrix符号由规则排列的深浅色正方形模块构成,每一个正方形模块就是一个基本单元。每一个基本单元又被编码为一比特的数据。
数据区的四周是探測图形。用于条码符号定位和确定条码结构信息。探測图形的四周是空白区,用以将条码符号与背景分离。
探測图形是一个模块的宽度。是数据区的边界,当中所有由深色模块组成的两条邻边构成了一个“L”形实线边缘,“L”对面由交替的深浅模块组成的两条邻边又构成了虚线边缘。探測图形主要用于限定符号的单元结构,也可用于确定符号的物理尺寸。以及解决符号定位和失真等问题。
数据区是由多个正方形深浅模块所组成的正方形区域,信息储存方式是深浅模块的不同排列组合.以二进制码方式来编码数据。因此计算机可直接读取。深色模块代表“1”。浅色模块代表“0”,再利用成串的特定排列的深浅模块来描写叙述码字信息,再排列成一个矩阵式符号,终于形成Data Matrix条码。
因此。随意Data Matrix符号能够由四个部分构成:探測图形中“L”形的两条实线边缘、探測图形中“L”形对面的两条虚线边缘、被探測图形包围的数据区、条码符号四周的一个模块宽度的空白区。
Data Matrix条码编码是将物品信息转化成为数据码字流,用二维条码符号来表示实现。
同意输入数据信息多样。能够是数字和字母,能够是常规的文字、字符信息,还能够是多媒体信息,如声音、图片、指纹等。
Data Matrix分为ECC 000-140和ECC 200两个大类,ECC 000-140具有四个等级的卷积纠错功能,ECC 200则通过Reed—Solomon纠错算法计算纠错码,依据符号的不同尺寸得到不同的纠错码。两类符号的外形差别在于,ECC 000-140符号的右上角为深色模块(仅为奇数)。尺寸从9*9至49*49。ECC 200符号的右上角为浅色模块(仅为偶数)。尺寸从10*10至144*144,若为长方形则从8*18至16*48。ECC 200应用较多。
Data Matrix编码包括三个部分:一是将数据信息流通过最优的编码规则转换成数据码字。二是依据Reed-Solomon算法以及响应的纠错要求,在数据码字的基础上生成纠错码字,数据码字加上纠错码字及可能须要的若干填充字符,构成编码后的码字流;三是将依照标准模板将单元模块放置到矩阵中,并增加探測图形,生成Data Matrix二维矩阵码符号。
Data Matrix二维条码图像的识别主要包括图像预处理、条码定位、採样解码。
Data Matrix条码图像预处理:首先对採集到的彩色图像灰度化;然后对灰度图像进行滤波去噪;选取适当的阈值进行图像二值化;最后进行边缘提取。
条码定位:区域初定位、边缘检測、旋转校正、精确提取、条码切割(网格)。
Data Matrix条码解码识别:依据採样网格,将深浅模块转换为“1”、“0”矩阵。去除探測图形,提取出数据区,并得到条码尺寸和版本号信息;调用模块放置矩阵恢复正确顺序的码字流。再确定数据码字和纠错码字,并进行条码数据的检错纠错。终于恢复原始数据,正确解码输出。
Data Matrix核心库它的license是BSD,具体介绍见主页http://www.libdmtx.org/ 。
以下具体介绍Data Matrix在VS2010中编译过程:
1. 从http://sourceforge.net/projects/libdmtx/下载其稳定版本号libdmtx-0.7.4;
2. 新建一个libdmtx静态库project,将/libdmtx-0.7.4文件夹下对应的.h、.c文件增加到此project中;
3. 对源码进行调整:(1)、将dmtx.h和dmtxstatic.h两个头文件分别包括到每一个.c文件里;(2)、对于错误C2129,处理办法是将声明和实现中的“static”keyword都去掉;(3)、将float.h、stdio.h、limits.h、assert.h、math.h文件增加到dmtx.h中;(4)、将CHKERR、CHKSCHEME、CHKSIZE、CALLBACK_MATRIX等的定义从dmtxencodescheme.c中复制到dmtx.h中;(5)、凝视掉dmtx.c文件里包括的.c文件;(6)、将文件里的snprintf函数用sprintf_s函数替代;
4. 新建barcodetest控制台project,对libdmtx库进行简单測试。相关文件代码例如以下(代码參考/libdmtx-0.7.4/test/simple-test/simple_test.c):
stdafx.h:
#pragma once #include "targetver.h" #include <stdio.h> #include "../../src/datamatrix/libdmtx-0.7.4/dmtx.h"
stdafx.cpp:
#include "stdafx.h" #ifdef _DEBUG
#pragma comment(lib, "../../../lib/dbg/x86_vc10/libdmtx[dbg_x86_vc10].lib")
#else
#pragma comment(lib, "../../../lib/rel/x86_vc10/libdmtx[rel_x86_vc10].lib")
#endif
barcodetest.cpp:
#include "stdafx.h"
#include <iostream>
#include <assert.h>
#include <string> using namespace std; int main(int argc, char* argv[])
{
size_t width, height, bytesPerPixel;
string str = "中国_abc_DEF_123_@#$!";
string dst;
unsigned char *pxl;
DmtxEncode *enc;
DmtxImage *img;
DmtxDecode *dec;
DmtxRegion *reg;
DmtxMessage *msg; //fprintf(stdout, "input: \"%s\"\n", str);
cout<<"str : "<<str<<endl; /* 1) ENCODE a new Data Matrix barcode image (in memory only) */
enc = dmtxEncodeCreate();
assert(enc != NULL);
//dmtxEncodeDataMatrix(enc, strlen(str), str);
dmtxEncodeDataMatrix(enc, strlen(str.c_str()), (unsigned char*)str.c_str()); /* 2) COPY the new image data before releasing encoding memory */
width = dmtxImageGetProp(enc->image, DmtxPropWidth);
height = dmtxImageGetProp(enc->image, DmtxPropHeight);
bytesPerPixel = dmtxImageGetProp(enc->image, DmtxPropBytesPerPixel); pxl = (unsigned char *)malloc(width * height * bytesPerPixel);
assert(pxl != NULL);
memcpy(pxl, enc->image->pxl, width * height * bytesPerPixel); dmtxEncodeDestroy(&enc); /* 3) DECODE the Data Matrix barcode from the copied image */
img = dmtxImageCreate(pxl, width, height, DmtxPack24bppRGB);
assert(img != NULL); dec = dmtxDecodeCreate(img, 1);
assert(dec != NULL); reg = dmtxRegionFindNext(dec, NULL);
if(reg != NULL) {
msg = dmtxDecodeMatrixRegion(dec, reg, DmtxUndefined);
if(msg != NULL) {
/*fputs("output: \"", stdout);
fwrite(msg->output, sizeof(unsigned char), msg->outputIdx, stdout);
fputs("\"\n", stdout);*/
dst = string(reinterpret_cast<const char*>(msg->output));
dmtxMessageDestroy(&msg);
}
dmtxRegionDestroy(®);
} cout<<"dst : "<<dst<<endl; dmtxDecodeDestroy(&dec);
dmtxImageDestroy(&img);
free(pxl); cout<<"ok!"<<endl;
return 0;
}
二维码Data Matrix简单介绍及在VS2010中的编译的更多相关文章
- 二维码Data Matrix编码、解码使用举例
二维码Data Matrix的介绍见: http://blog.csdn.net/fengbingchun/article/details/44279967 ,这里简单写了个生成二维码和对二维码进行 ...
- 二维码Data Matrix的解码实现(zxing-cpp)
二维码Data Matrix的介绍可以参考http://blog.csdn.net/fengbingchun/article/details/44279967 ,以下是通过zxing-cpp开源库实现 ...
- (zxing.net)二维码Data Matrix的简介、实现与解码
一.简介 Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明.Data-Matri ...
- c#高效准确的条形码、线性条码、QR二维码读写类库-SharpBarcode介绍
SharpBarcode是一款支持.NET(C#,VB)的高效易用的条形码.QR二维码的读取和生成类库. 主要功能: 1.支持几乎所有常见类型的线性条形码和QR二维码的读取,高效读取,准确率高. 2. ...
- Android ZXing 二维码、条形码扫描介绍
本帖最后由 Shims 于 2013-11-9 12:39 编辑 最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个开源的 ZXing项目.它提供二维码和条形码 ...
- java学习-zxing生成二维码矩阵的简单例子
这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <gr ...
- 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...
http://blog.csdn.net/lidew521/article/details/24441825
- Java生成艺术二维码也可以很简单
原文点击: Quick-Media Java生成艺术二维码也可以很简单 现在二维码可以说非常常见了,当然我们见得多的一般是白底黑块,有的再中间加一个 logo,或者将二维码嵌在一张特定的背景中(比如微 ...
- 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...
随机推荐
- IIS Web服务扩展中没有Asp.net 2.0
服务器上安装了ASP.NET v2.0组件,但是在IIS的Web服务扩展中并没有找到ASP.NET v2.050727这项,这导致基于.NET2.0开发的网页都无法正常浏览. 解决方法:打开IIS,转 ...
- linux 如何正确的关闭mongodb
有的朋友说可以通过下面的命令关闭mongodb: killall mongodb #or kill -9 mongo-pid 上面的方法确实可以关闭mongodb,但是正确的做法不是这样子的,mong ...
- 利用blob对象实现粘贴图片
blob的一个常用应用场景,就是获取剪切板上的数据来进行粘贴的操作.例如通过QQ截图后,需要在网页上进行粘贴操作. 粘贴图片我们需要解决下面几个问题 1.监听用户的粘贴操作 2.获取到剪切板上的数据 ...
- LigerUI之Grid使用详解(一)——显示数据
目录: 一.概述 二.Grid使用步骤 三.使用Grid展示数据 四.源码下载 一.概述 在开发web信息管理系统时,使用Web前端框架可以帮助我们快速搭建一组风格统一的界面效果,而且能够解决大多数浏 ...
- 以相声之名说android四大对象
当里个当,当里个当,Android此系统,易用有好用.谁为其奉献,只靠四巨头. 当里个当,当里个当,老大唤activity,界面缔造者.清水出芙蓉,天然来雕饰. 当里个当,当里个当,你若明白他,周期咋 ...
- Android -- Annotation
Override Annotation @Override public void onCreate(Bundle savedInstanceState){}; 概念 An annotation is ...
- Graph 卷积神经网络:概述、样例及最新进展
http://www.52ml.net/20031.html [新智元导读]Graph Convolutional Network(GCN)是直接作用于图的卷积神经网络,GCN 允许对结构化数据进行端 ...
- VMware中让虚拟机支持虚拟化
一.问题 由于需要玩一下OpenNebula,但是现在自己只有一台笔记本,如何玩?当然是VMVare了,于是装了几台Ubuntu的虚拟机,但是在看安装OpenNebula的前提要求是 安装的主机cpu ...
- Git直接拉取远程分支
用Git,一直有个疑惑,可不可以不拉取远程Origin主干,我直接pull一个分支下来 今天想了一下,找到了一个办法 本地分支关联 // 0.新建一个文件夹,然后初始化git git init // ...
- [Canvas]走近的女孩
动态效果请点此下载文件并使用Chrome或者FireFox浏览器观看. 图例: 代码: <!DOCTYPE html> <html lang="utf-8"> ...