二维码Data Matrix简介及在VS2010中的编译
Data Matrix 二維條碼原名Datacode,由美國國際資料公司(International Data Matrix, 簡稱ID Matrix)于1989年發(fā)明。Data-Matrix二維條碼是一種矩陣式二維條碼。
Data Matrix符號由規(guī)則排列的深淺色正方形模塊構(gòu)成,每個正方形模塊就是一個基本單元,每個基本單元又被編碼為一比特的數(shù)據(jù)。數(shù)據(jù)區(qū)的四周是探測圖形,用于條碼符號定位和確定條碼結(jié)構(gòu)信息。探測圖形的四周是空白區(qū),用以將條碼符號與背景分離。
探測圖形是一個模塊的寬度,是數(shù)據(jù)區(qū)的邊界,其中全部由深色模塊組成的兩條鄰邊構(gòu)成了一個“L”形實線邊緣,“L”對面由交替的深淺模塊組成的兩條鄰邊又構(gòu)成了虛線邊緣。探測圖形主要用于限定符號的單元結(jié)構(gòu),也可用于確定符號的物理尺寸,以及解決符號定位和失真等問題。
數(shù)據(jù)區(qū)是由多個正方形深淺模塊所組成的正方形區(qū)域,信息儲存方式是深淺模塊的不同排列組合.以二進(jìn)制碼方式來編碼數(shù)據(jù),因此計算機(jī)可直接讀取。深色模塊代表“1”,淺色模塊代表“0”,再利用成串的特定排列的深淺模塊來描述碼字信息,再排列成一個矩陣式符號,最終形成Data Matrix條碼。
因此,任意Data Matrix符號可以由四個部分構(gòu)成:探測圖形中“L”形的兩條實線邊緣、探測圖形中“L”形對面的兩條虛線邊緣、被探測圖形包圍的數(shù)據(jù)區(qū)、條碼符號四周的一個模塊寬度的空白區(qū)。
Data Matrix條碼編碼是將物品信息轉(zhuǎn)化成為數(shù)據(jù)碼字流,用二維條碼符號來表示實現(xiàn)。允許輸入數(shù)據(jù)信息多樣,可以是數(shù)字和字母,可以是常規(guī)的文字、字符信息,還可以是多媒體信息,如聲音、圖片、指紋等。
Data Matrix分為ECC 000-140和ECC 200兩個大類,ECC 000-140具有四個等級的卷積糾錯功能,ECC 200則通過Reed—Solomon糾錯算法計算糾錯碼,根據(jù)符號的不同尺寸得到不同的糾錯碼。兩類符號的外形區(qū)別在于,ECC 000-140符號的右上角為深色模塊(僅為奇數(shù)),尺寸從9*9至49*49。ECC 200符號的右上角為淺色模塊(僅為偶數(shù)),尺寸從10*10至144*144,若為長方形則從8*18至16*48。ECC 200應(yīng)用較多。
Data Matrix編碼包括三個部分:一是將數(shù)據(jù)信息流通過最優(yōu)的編碼規(guī)則轉(zhuǎn)換成數(shù)據(jù)碼字;二是根據(jù)Reed-Solomon算法以及響應(yīng)的糾錯要求,在數(shù)據(jù)碼字的基礎(chǔ)上生成糾錯碼字,數(shù)據(jù)碼字加上糾錯碼字及可能需要的若干填充字符,構(gòu)成編碼后的碼字流;三是將按照標(biāo)準(zhǔn)模板將單元模塊放置到矩陣中,并加入探測圖形,生成Data Matrix二維矩陣碼符號。
Data Matrix二維條碼圖像的識別主要包括圖像預(yù)處理、條碼定位、采樣解碼。
Data Matrix條碼圖像預(yù)處理:首先對采集到的彩色圖像灰度化;然后對灰度圖像進(jìn)行濾波去噪;選取適當(dāng)?shù)拈撝颠M(jìn)行圖像二值化;最后進(jìn)行邊緣提取。
條碼定位:區(qū)域初定位、邊緣檢測、旋轉(zhuǎn)校正、精確提取、條碼分割(網(wǎng)格)。
Data Matrix條碼解碼識別:根據(jù)采樣網(wǎng)格,將深淺模塊轉(zhuǎn)換為“1”、“0”矩陣;去除探測圖形,提取出數(shù)據(jù)區(qū),并得到條碼尺寸和版本信息;調(diào)用模塊放置矩陣恢復(fù)正確順序的碼字流;再確定數(shù)據(jù)碼字和糾錯碼字,并進(jìn)行條碼數(shù)據(jù)的檢錯糾錯;最終恢復(fù)原始數(shù)據(jù),正確解碼輸出。
Data Matrix核心庫它的license是BSD,詳細(xì)介紹見主頁http://www.libdmtx.org/? 。
下面詳細(xì)介紹Data Matrix在VS2010中編譯過程:
1.??從http://sourceforge.net/projects/libdmtx/下載其穩(wěn)定版本libdmtx-0.7.4;
2.??新建一個libdmtx靜態(tài)庫工程,將/libdmtx-0.7.4目錄下相應(yīng)的.h、.c文件加入到此工程中;
3.??對源代碼進(jìn)行調(diào)整:(1)、將dmtx.h和dmtxstatic.h兩個頭文件分別包含到每個.c文件中;(2)、對于錯誤C2129,處理辦法是將聲明和實現(xiàn)中的“static”關(guān)鍵字都去掉;(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函數(shù)用sprintf_s函數(shù)替代;
4.?新建barcodetest控制臺工程,對libdmtx庫進(jìn)行簡單測試,相關(guān)文件代碼如下(代碼參考/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
總結(jié)
以上是生活随笔為你收集整理的二维码Data Matrix简介及在VS2010中的编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leptonica在VS2010中的编译
- 下一篇: Windows7中搭建Android x