二维码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静态库工程,将/libdmtx-0.7.4目录下相应的.h、.c文件加入到此工程中;

3.  对源代码进行调整:(1)、将dmtx.h和dmtxstatic.h两个头文件分别包含到每个.c文件中;(2)、对于错误C2129,处理办法是将声明和实现中的“static”关键字都去掉;(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控制台工程,对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(&reg);
	}

	cout<<"dst : "<<dst<<endl;

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

	cout<<"ok!"<<endl;
	return 0;
}

GitHubhttps://github.com/fengbingchun/BarCode_Test

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
AutoCAD是一种流行的计算机辅助设计(CAD)软件,可以用来设计和制图。虽然AutoCAD本身并没有直接生成Data Matrix二维码的功能,但是可以利用其强大的绘图和编辑功能来绘制和修改Data Matrix二维码。 要生成Data Matrix二维码,首先需要用专业的二维码生成器创建Data Matrix二维码图像文件。可以使用在线的或者本地的二维码生成器生成Data Matrix二维码图像文件,然后将生成的图像文件导入到AutoCAD。 在AutoCAD导入Data Matrix二维码图像文件后,可以使用绘图工具进行编辑和修改。可以根据需要对二维码进行缩放、旋转、平移等操作,以适应所需的绘图尺寸和位置。此外,还可以使用AutoCAD的文本工具在Data Matrix二维码图像文件的周围添加任何相关的文本或标签。 在对Data Matrix二维码图像进行编辑和修改后,可以对其进行打印或导出为其他格式的文件。通过选择合适的输出设置,可以将二维码图像打印到纸质文档上,或者导出为图像文件(如JPEG或PNG格式)以便在其他程序使用。 需要注意的是,为了确保生成的Data Matrix二维码图像在其他设备上能够正确扫描,需要选择合适的尺寸和分辨率。此外,根据二维码的实际用途,还需要保证二维码的错误纠正级别和数据容量满足要求。 总之,虽然AutoCAD本身没有直接生成Data Matrix二维码的功能,但可以利用其绘图和编辑工具对Data Matrix二维码图像进行修改和处理,以满足用户的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值