二维码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 = "中国[email protected]#$!";
	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

时间: 2024-09-30 16:31:00

二维码Data Matrix简单介绍及在VS2010中的编译的相关文章

二维码Data Matrix简介及在VS2010中的编译

Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明.Data-Matrix二维条码是一种矩阵式二维条码. Data Matrix符号由规则排列的深浅色正方形模块构成,每个正方形模块就是一个基本单元,每个基本单元又被编码为一比特的数据.数据区的四周是探测图形,用于条码符号定位和确定条码结构信息.探测图形的四周是空白区,用以将条码符号与背景分离. 探测图形是一个模块的宽度,是数据区的

Android ZXing 二维码、条形码扫描介绍

本帖最后由 Shims 于 2013-11-9 12:39 编辑 最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个开源的 ZXing项目.它提供二维码和条形码的扫描.扫描条形码就是直接读取条形码的内容,扫描二维码是按照自己指定的二维码格式进行编码和解码. 1.什么是二维码和条形码?                          二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代

微信电脑网页二维码扫描登陆简单实现

看那个微信电脑端的扫描登录看起来叼叼哒,找了一篇文章了解一下具体的实现思路和过程,看了牛人的分析后,发现实现起来也不是很难,这里我就简单的实现了一下.可能功能和流畅度没有微信做的好,具体是我对前端不是很了解. 好了,不多说,首先要有一个二维码的生成软件才行,这里找了一个叫QrenCode的软件,好处是可以在命令行中进行生成.(下载地址: http://pkgs.org/download/qrencode 找自己合适的下载 应该还要一个依赖库libqrencode) 1 #QrenCode 下面是

java学习-zxing生成二维码矩阵的简单例子

这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件 也可使用maven添加依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.0</version> </dependency> 最简单的生成二维码的方法,

怎样微信扫描二维码跳转页面,H5页面在微信中下载APP的实现方式

使用微信推广的用户经常都会遇到推广链接被拦截导致无法下载app的情况,此时用户在微信中打开会提示“ 已停止访问该网页 ”.这对于使用微信营销的商家来说就很不友好且损失非常大,因为用户是不知道为什么打不开的,商家不知道链接已被微信拦截,造成的结果就是用户大量流失,商家利益大量受损. 那么针对这个问题到底要怎么解决呢,其实只需要一个能实现微信内直接打开链接或跳转手机默认浏览器打开链接的功能,该功能实现后,如果你的链接含app文件则直接下载,如果不含则正常打开指定h5页面. 方案及实现效果 首先我们需

二维码扫描枪为何在商超店铺中受到欢迎呢?

科技的进步带动互联网的发展,而互联网的发展给我们生活带来了便捷,就比如在二维码支付的盛行的今天,很多超市便利店都开始寻求能够结合商品条码扫描和二维码收银功能的二维码扫描枪产品,技术的升级与发展,使得扫描设备具备通扫的功能,这也成为收银二维码扫描枪受到欢迎的原因之一. 一.功能多样化 传统的收银扫码枪只能够进行商品的条码扫描,虽然对于收银的效率有一定的提升,但收银找零还是给收银工作人员带来了较大的工作量.而新的收银扫码设备,不但具备了传统产品的商品扫码功能,同时还能够实现扫描付款二维码实现收款的功

二维码扫描的简单封装

导入即可,使用简单,类文件下载地址 使用如图:

swift编程语言简单开发二维码扫描

最近在学习swift编程语言(http://www.maiziedu.com/course/ios/16-161/), 在看视频学习swift编程语言时,发现有个二维码扫面案例的教程,非常的不错,其中还有一些动画的实现 ,今天就先记录一下二维码扫描的简单实现  不太好记手写一遍 学习的基础在于模仿嘛 创建一个实现二维码扫描的步骤 1.首先是懒加载创建 会话 输入设备  输出设备 // 先倒入框架 AVFoundation 2.    import AVFoundation 3.    //通过懒

Swift 二维码扫描 简单实现

3.30看视频  学到了二维码简单的实现 还有一些动画的实现  今天就先记录一下二维码扫描的简单实现  不太好记手写一遍 学习的基础在于模仿嘛 创建一个实现二维码扫描的步骤 1.首先是懒加载创建 会话 输入设备  输出设备 // 先倒入框架 AVFoundation import AVFoundation //通过懒加载 创建输入设备 private lazy var deviceInput: AVCaptureDeviceInput? = { //获取设备摄像头 let device = AV