二维码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(®);}cout<<"dst : "<<dst<<endl;dmtxDecodeDestroy(&dec);dmtxImageDestroy(&img);free(pxl);cout<<"ok!"<<endl;return 0;
}
GitHub: https://github.com/fengbingchun/BarCode_Test
相关文章:

一、数据库设计与性能优化--概述
前言我1998年第一次接触SQL Server 6.5 for Windows NT 4.0,当时的感觉就认为SQL Server只是一个功能强大的Excel文件。现在回想起来,当年抱着这样一种态度,我开发的那些应用程序应该是非常幼稚的,其性能可想而知。记得那时候随便…

第四范式戴文渊:AI落地,为什么不能照搬教科书?
“年少成名”、“天才”,在中国 AI 行业里用这两个词同时形容一个人的牛人不多,第四范式创始人戴文渊位列其中。在上海交通大学就读本科期间,戴文渊就带领三人团队夺得了 2005 年 ACM 的世界冠军和三个亚洲冠军,并担任ACM竞赛教练…

Kong Api 网关使用 docker 部署
Kong 镜像: https://hub.docker.com/_/kong 官网给定的用户安装手册上并没有设置 PG 的密码,导致如下问题无法启动 nginx: [error] init_by_lua error: /usr/local/share/lua/5.1/kong/init.lua:277: [PostgreSQL error] failed to >retrieve server_version_num…

Windows7中搭建Android x86_64及armv8-a操作步骤
1. 从https://developer.android.com/tools/sdk/ndk/index.html 下载android-ndk-r10d-windows-x86_64.exe 和 android-ndk-r10d-linux-x86_64.bin; 2. 在Ubuntu1404 64位中通过终端安装ndkr10d:./android-ndk-r10d-linux-x86_64.bin ; 3.…

ContentResolver.query()—buildQueryString()
Cursor cursor context.getContentResolver().query(Sms.CONTENT_URI, new String[]{"thread_id from sms where type 3 group by thread_id—"}, // 可以这样使用。 null, null, null); 07-17 10:55:17.084: E/AndroidRuntime(30157): FATAL EX…

Room Database完全使用手册
前言 Android数据持久层直接使用SQLite很麻烦,Google官方推出了Room, Google对Room的定义: The Room persistence library provides an abstraction layer over SQLite to allow fluent database access while harnessing the full power of …

wiki的使用
Wiki一词来源于夏威夷语的”weekee wee kee”,被译为”维基”或”维客”。Wiki是一种多人协作的写作编辑平台。在Wiki网站上,访问者可以修改、完善已经存在的页面,或者创建新内容。 可以利用”维基百科:沙盒”来练习如何编辑&…

GAMIT安装备忘
2019独角兽企业重金招聘Python工程师标准>>> 系统环境: VMware Workstation9 ubuntu 10.04 操作 1.安装VMware Workstation 参考: VMware Workstation下载:http://pan.baidu.com/share/link?shareid407480&uk258569718…

FreeType简介及在vs2010的编译使用
FreeType库是一个开源、高质量、可扩展、可定制、可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括点阵字、TrueType、OpenType、Type1、CID、CFF、Windows FON/FNT、X11 PCF等。 FreeType有两个License,一个是BSD-stype&…

firefox下的调试工具
2019独角兽企业重金招聘Python工程师标准>>> vue-devtools https://addons.mozilla.org/en-US/firefox/user/13100848/ 转载于:https://my.oschina.net/u/3371661/blog/3003299

NLP为RPA带来了什么价值?
什么是 RPA(Robotic Process Automation)?机器人流程自动化(RPA)是一种自动化工具,用于创建软件机器人的虚拟劳动力,从而优化和降低企业中端到端业务流程的成本。RPA 可以翻译成机器人流程自动化…

从原理到代码,轻松深入逻辑回归模型!
整理 | Jane出品 | AI科技大本营(ID:rgznai100)【导语】学习逻辑回归模型,今天的内容轻松带你从0到100!阿里巴巴达摩院算法专家、阿里巴巴技术发展专家、阿里巴巴数据架构师联合撰写,从技术原理、算法和工程…

JVM内存管理学习总结(一)
I.JVM进程的生命周期 JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失。那么程序启动和程序终止就是JVM实例生命周期的两个边界,两个边界点可以这么理解&#…
开源库Simd在vs2010中的编译及简单使用
Simd是开源的图像处理库,它提供了很多高性能的算法,这些优化算法主要由SIMD指令来实现,包括SSE、SSE2、SSSE3、SSE4.1、SSE4.2、AVX等,此库可以应用在windows/linux 32bit/64bit等系统中。此库更新较频繁。此库的license是MIT。下…

Dubbo2.6.5+Nacos注册中心(代替Zookeeper)
在上一节的小栗子的基础上,只需要更改两个地方 第一个:父工程的pom依赖增加 <!-- Dubbo Nacos registry dependency --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo-registry-nacos</artifactId>…

Nginx(二) 配置与调试
nginx 主配置文件在安装目录下的conf中,名字为nginx.conf:主配置文件主要分为4部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和location&#x…

AI编程语言图鉴
作者 | 元宵大师责编 | 胡巍巍来源 | CSDN(CSDNnews)当前最炙手可热的领域非“人工智能”(Artificial Intelligence)莫属。其实,“人工智能”的火热并非一蹴而就,早在1956年“人工智能”概念就已经被提出了…

C++动态二维数组演示的代码
将代码过程中经常用到的代码珍藏起来,下边资料是关于C动态二维数组演示的代码。 #include <iostream> #include <string>using namespace std;{for( int i 0; i < x; i ){List[i] new int[y];for( int j 0; j < y; j ){List[i][j] 0;}}for( i…

linux发送email错误 501 Syntax: HELO hostname
2019独角兽企业重金招聘Python工程师标准>>> 查看你的hostname hostnamecentos58 然后vi /etc/hosts 添加hostname对应的ip 103.24.3.171 centos58 参考http://blog.csdn.net/tammy_zhu/article/details/5563383 转载于:https://my.oschina.net/u/257088/bl…

redux-thunk使用教程
从无到有一步一步创建一个react-redux、redux-thunk使用教程:本教程GitHub地址:https://github.com/chunhuigao/react-redux-thunk创建react工程在电脑上找一个文件夹,在命令窗使用create-react-app 创建我的react工程;这一步应该…

VLC SDK在VS2010中的配置及简单使用举例
1. 从http://www.videolan.org/vlc/download-windows.html下载vlc-2.2.0-win32.7z,解压缩;2. 新建一个VLCtest控制台工程;3. 将/vlc-2.2.0-win32/vlc-2.2.0/sdk/include添加到工程属性中,C/C -->General …

百万奖金悬赏AI垃圾分类,就问你来不来?
也许我们从来没有想过,看似简单的垃圾分类居然给“聪明”的人类带来如此大的困扰2019年7月1日,史称“最严格的垃圾分类法”《上海市生活垃圾管理条例》正式开始施行一夜之间上海人最常用的见面语从“侬好”变成了“侬是什么垃圾?”虽然只有可…

资质申报 - 系统集成企业资质等级评定条件(2012年修定版)
关于发布《计算机信息系统集成企业资质等级评定条件(2012年修定版)》的通知工信计资[2012]6号各省、自治区、直辖市、计划单列市工业和信息化主管部门、新疆生产建设兵团工业和信息化委员会、各级资质评审机构,各有关单…

@HostListener 可接收的事件列表
下面有一个文档详细介绍Angular 中的事件列表: https://github.com/angular/angular/blob/master/packages/compiler/src/schema/dom_element_schema_registry.ts#L78。 星号代表的是事件 (no prefix): property is a string.*: property represents an event.!: pr…

GraphSAGE: GCN落地必读论文
作者 | William L. Hamilton, Rex Ying, Jure Leskovec来源 | NIPS17导读:图卷积网络(Graph Convolutional Network,简称GCN)最近两年大热,取得不少进展。作为 GNN 的重要分支之一,很多同学可能对它还是一知…

Ubuntu14.04 32位上编译VLC2.2.0源码操作步骤
1. 首先安装必须的依赖软件,打开终端,执行:sudo apt-get install git libtool build-essential pkg-config autoconf2. 从 http://www.videolan.org/vlc/download-sources.html 下载vlc-2.2.0源码,将其存放到/home/spring/VLC目录…

根据PromiseA+规范实现Promise
Promise是ES6出现的一个异步编程的一个解决方案,改善了以往回调函数的回调地狱(虽然写起来也挺像的)。不会Promise的可以移步阮一峰的Promise,这里讲的非常清晰。 就现在的发展情况而言,Promise这种解决方案频繁的在我们的代码中出现…

黄浴:基于深度学习的超分辨率图像技术发展轨迹一览
作者 | 黄浴转载自知乎导读:近年来,使用深度学习技术的图像超分辨率(SR)取得了显著进步。本文中,奇点汽车自动驾驶首席科学家黄浴对基于深度学习技术的图像超分辨率技术进行了一次全面的总结,分析了这门技术…

Qt简介、安装及在Ubuntu14.04 32位上简单使用举例
Qt是一个跨平台的C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序。Qt是面向对象的框架,很容易扩展。Qt是一个C工具包,它由几百个C类构成,你在程序中可以使用这些类。Qt具有OOP的所有优点。 跨平台的…

FOSCommentBundle功能包:设置Doctrine ODM映射(投票)
原文出处:12b-mapping_mongodb.md原文作者:FriendsOfSymfony授权许可:创作共用协议翻译人员:FireHare校对人员:适用版本:FOSCommentBundle 2.0.5文章状态:草译阶段Step 12b: Setup MongoDB mapp…