二維碼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(&reg);
	}

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

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

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

GitHubhttps://github.com/fengbingchun/BarCode_Test


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM