




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、ALIENTEK STM32開發(fā)板AN1616AAN1616A ATK-QR 二維碼&條碼識別庫使用說明二維碼、條形碼相信大家都耳熟能詳了,條碼技術(shù)已經(jīng)廣泛應(yīng)用于我們生活當(dāng)中。微信掃二維碼、支付寶二維碼付款、商品條形碼、超市儲物柜條形碼等。本應(yīng)用文檔(AN1616A, 對應(yīng)探索者 STM32F407 開發(fā)板擴(kuò)展實驗 SE01)將教大家如何在 ALIENTEK 探索者 STM32F407 開發(fā)板上使用 AKT-OV2640 攝像頭模塊完成二維碼、一維條形碼掃描識別實驗。本章分為如下幾部分: 1, 一維條形碼、二維碼簡介 2, 硬件連接 3, 軟件實現(xiàn) 4, 驗證
2、1、一維條形碼、二維碼簡介1.1 一維條形碼 一維條形碼是將寬度不等的多個黑條和空白,按照一定的編碼規(guī)則排列,用以表達(dá)一組信息的圖形標(biāo)識符。條形碼可以標(biāo)出物品的生產(chǎn)國、制造廠家、商品名稱、生產(chǎn)日期、圖書分類號、郵件起止地點、類別、日期等許多信息。常用碼制的包括 EAN 碼、UPC 碼、39 碼、交叉 25 碼、128 碼、93 碼及 Codabar 庫德巴碼等。識別原理:將條形碼條符寬度、間 隔空間等空間信息轉(zhuǎn)換成二進(jìn)制碼流,然后再編碼即可。 1.2 二維碼 二維碼是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號信息的。在代碼編制上巧妙地利用構(gòu)成計算機(jī)內(nèi)部邏
3、輯基礎(chǔ)的“0”、“1”比特流的概念,使用若干個與二進(jìn)制相對應(yīng)的幾何形體來表示文字?jǐn)?shù)值信息。常用的碼制有: Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K 等。二維碼的優(yōu)點:二維碼存儲的數(shù)據(jù)量更大;可以包含數(shù)字、字符,及中文文本等混合內(nèi)容且有一定的容錯性(在部分損壞以后可以正常讀取,比如在二維碼中間插入一張小圖片)。本實驗識別的二維碼類型是我們最常用的和見到的 QR 二維碼,我們常見的微信二維碼、支付 寶二維碼、商品二維碼均是 QR 二維碼。圖 1.1 為 QR 二維碼構(gòu)
4、造框圖。 開源電子網(wǎng)2016-07-14ALIENTEK STM32開發(fā)板AN1616A圖 1.1 QR 二維碼構(gòu)造框圖 1. 位置探測圖形、位置探測圖形分隔符:用于對二維碼的定位,對每個 QR 碼來說, 位置都是固定存在的,只是大小規(guī)格會有所差異;這些黑白間隔的矩形塊很容易進(jìn)行圖像處理的檢測。 2. 校正圖形:根據(jù)尺寸的不同,矯正圖形的個數(shù)也不同。矯正圖形主要用于 QR 碼形 狀的矯正,尤其是當(dāng) QR 碼印刷在不平坦的面上,或者拍照時候發(fā)生畸變等。 .定位圖形:這些小的黑白相間的格子就好像坐標(biāo)軸,在二維碼上定義了網(wǎng)格
5、。格式信息:表示該二維碼的糾錯級別,分為 L、M、Q、H; 數(shù)據(jù)區(qū)域:使用黑白的二進(jìn)制網(wǎng)格編碼內(nèi)容。8 個格子可以編碼一個字節(jié)。 版本信息:即二維碼的規(guī)格,QR 碼符號共有 40 種規(guī)格的矩陣(一般為黑白色),從 21x21(版本 1),到 177x177(版本 40),每一版本符號比前一版本 每邊增加 4 個模塊。 7. 糾錯碼字:用于修正二維碼損壞帶來的錯誤。 了解了 QR 二維碼的構(gòu)造,下面我們來了解編碼及解碼原理,QR 二維碼的編碼流程如下圖 1.2.1 所示。QR 二維碼的解碼流程如下圖 1.2.2 所示。 開源電子網(wǎng)2016-07-14www.alie
6、ALIENTEK STM32開發(fā)板AN1616A圖 1.2.1QR 二維碼編碼流程圖 1.2.2QR 二維碼解碼流程開源電子網(wǎng)2016-07-14ALIENTEK STM32開發(fā)板AN1616A二維碼的編碼及解碼流程具體實現(xiàn)的步驟和方法是比較復(fù)雜,涉及到了 QR 二維碼的標(biāo)準(zhǔn)規(guī)則及相對應(yīng)的算法,知識點很多,大家感興趣的話可以自己多去百度了解。以下兩個文檔分別是 QR 二維碼編碼解碼標(biāo)準(zhǔn)、二維碼編解碼及系統(tǒng)實現(xiàn)。 1.QRCode-編碼解碼標(biāo)準(zhǔn).pdf,在:ATK-QR 二維碼&條形碼識別庫3,二維碼識別參考資料 文件
7、夾。 二維條碼的編解碼及系統(tǒng)實現(xiàn).pdf,在:ATK-QR 二維碼&條形碼識別庫3,二維碼識別參考資料 文件夾。 以上說了很多關(guān)于一維條形碼、二維碼的知識是為了幫助大家了解關(guān)于它們的基礎(chǔ)識,2.實際上我們并不需要去研究太多,因為市面上已經(jīng)有成熟的條碼編碼解碼庫了,比如手機(jī)常用的 ZBar 和 ZXing 庫。這里,我們ALIENTEK 提供了一個基于 ZBar 的解碼庫,并封裝成了 lib 方便大家使用(因為是由朋友移植的,他不愿意公開源代碼,所以無法提供源碼)。 2、硬件連接 本實驗使用到的硬件資源有: 1, ATK-OV2640 攝像頭模塊。 2, LCD 模塊。 3, LED(DS0/D
8、S1)。 4, 按鍵(KEY0KEY1KEY2KEY_UP)。5, 蜂鳴器。 3、軟件實現(xiàn) 本實驗在探索者 STM32F407 開發(fā)板的照相機(jī)實驗基礎(chǔ)上進(jìn)行修改,去除了不需要的PICTURE 和 USMART,并在工程路徑中新建了 ATKQR 文件,里面包含了我們提供的ATK_QR_V1.4.lib、atk_qrdecode.c 和.h。atk_qrdecode.h 主要是 lib 的 API 和用戶需要提供內(nèi)存管理函數(shù)及編碼轉(zhuǎn)換函數(shù)。該二維碼、條碼識別 lib 功能如下: 1,支持 QR 二維碼識別。(包括常見的 UTF8 編碼格式和特殊的GBK 編碼格式)。 2,支持 EAN 碼、39 碼
9、、交叉 25 碼、UPC 碼、128 碼等編碼方式的條碼識別。 3,支持 UTF8-OEM 轉(zhuǎn)換輸出(需要客戶自己提供轉(zhuǎn)換碼表,OEM 一般指GBK 編碼)。4,內(nèi)存占用:6K(算法內(nèi)存)+ bmp_heigh* bmp_width(字節(jié),8 位灰度圖像內(nèi)存)。首先我們看一下atk_qrdecode.h: 開源電子網(wǎng)2016-07-14#define ATK_QR_UTF82OEM_SUPPORT1#define ATK_QR_GBK_SUPPORT1/返回值定義 #define ATK_QR_OK0/正常 #define ATK_QR_MEM_ERR1/內(nèi)存錯誤
10、 #define ATK_QR_OTHER_ERR2/其他錯誤 #define ATK_QR_RECO_ERR3/無法識別 u8 atk_qr_init(void);/初始化識別庫 /QR 解碼函數(shù) u8 atk_qr_decode(u16 bmp_width,u16 bmp_heigh,u8 *bmp,u8 btype,u8* result); void atk_qr_destroy(void);/結(jié)束識別,釋放內(nèi)存 void atk_qr_memset(void *p,u8 c,u32 len);/內(nèi)存設(shè)置函數(shù) void *atk_qr_malloc(u32 size);/動態(tài)申請內(nèi)存 w
11、ALIENTEK STM32開發(fā)板AN1616AATK_QR_UTF82OEM_SUPPORT:定義是否支持將 UTF8 編碼轉(zhuǎn)換為 OEM 編碼(中文一般是指 GBK 編碼),定義為:1 則輸出結(jié)果為 GBK 編碼方式的字符串;定義為:0 則輸出的是原始字符串(未做編碼轉(zhuǎn)換,可能是 UTF8,也可能是 GBK 取決于二維碼的編碼方式)。 ATK_QR_GBK_SUPPORT:定義在 ATK_QR_UTF82OEM_SUPPORT=1 的時候,是否支持識別GBK 編碼的二維碼,如果定義為 1,則程序會先判斷是 UTF8 還是GBK,根據(jù)識別結(jié)果再做轉(zhuǎn)換。如果定義為
12、 0 則只識別UTF8 編碼方式的二維碼.不識別GBK 編碼的二維碼。注意: 1,當(dāng) ATK_QR_UTF82OEM_SUPPORT=0 的時候,該宏定義不起作用.2,當(dāng)發(fā)現(xiàn)有識別錯誤(UTF8 識別成 GBK 了)的時候,可設(shè)置 ATK_QR_GBK_SUPPORT=0,以更好的支持 UTF8。常見的 QR 二維碼格式大多數(shù)為 UTF8 格式。 3,這里的 GBK 并不是所有 GBK 都支持,僅支持 GB2312 編碼的識別。 接下來,我們重點介紹一下:u8atk_qr_decode(u16 bmp_width,u16 bmp_heigh,u8 *bmp,u8 btype,u8* resul
13、t) 這個函數(shù),它的參數(shù)說明: img_width,img_heigh:輸入圖像的寬度和高度。imgbuf:圖像緩存區(qū)(8 位灰度圖像,不是 RGB565!) btype: 0,識別二維碼。 1,識別 CODE128 條碼。 2,識別 CODE39 條碼。 3,識別 I25 條碼。 4,識別 EAN13 條碼。 result:識別結(jié)果緩沖區(qū)。如果 result0=0,則說明未識別到任何數(shù)據(jù),否則就是識別到的數(shù)據(jù)(字符串)。 返回值:ATK_QR_OK,識別完成,返回其他是相對應(yīng)錯誤代碼(以上返回值定義)。 提示:如果需要對所有支持的編碼進(jìn)行識別,則輪流設(shè)置 btype 為 04 即可實現(xiàn)。 本
14、 LIB 移植步驟: 1,實現(xiàn) atk_qrdecode.c 里面的所有函數(shù)。 2,堆棧(Stack_Size)設(shè)置為 0X1000 或以上,在 startup_stm32f40_41xx.s 中設(shè)置。本 LIB 使用步驟: 1,調(diào)用 atk_qr_init 函數(shù),初始化識別程序,返回值為 ATK_QR_OK,則初始化成功。2,調(diào)用 atk_qr_decode 函數(shù),給定參數(shù),對圖像進(jìn)行識別。 3,如果需要不停的識別,則重復(fù)第 2 個步驟即可。 5, 調(diào)用 atk_qr_destroy 函數(shù),結(jié)束識別,釋放所有內(nèi)存結(jié)束識別。 ATK_QR_V1.4.lib 移植及使用步驟在 atk_qrdec
15、ode.c 注釋中都有說明,具體過程,見 main.c 中的 qr_decode()函數(shù)。下面來看一下 qr_decode()這個函數(shù): 開源電子網(wǎng)2016-07-14/imagewidth:240)if(imagewidth%240)return ;/不是 240 的倍數(shù),直接退出 qr_img_width=240; qr_img_scale=imagewidth/qr_img_width;elseqr_img_width=imagewidth; qr_img_scale=1;result=mymalloc(SRAMIN,1536);/申請識別結(jié)果存放內(nèi)存 /C
16、CM 管理內(nèi)存為 60K,這里最大可申請 240*240=56K bmp=mymalloc(SRAMCCM,qr_img_width*qr_img_width); mymemset(bmp,0,qr_img_width*qr_img_width); for(i=0;iqr_img_width;i+)for(j=0;j 8)*76+(Color&0x7E0)3)*150+(Color&0x001F)8;/ 識 別 灰 度 圖 片 ( 注 意 : 單 次 耗 時 約 0.2S) atk_qr_decode(qr_img_width,qr_img_width,bmp,bartype,result);
17、 if(result0=0)/沒有識別出來 bartype+; if(bartype=5)bartype=0;else if(result0!=0)/識別出來了,顯示結(jié)果 BEEP=1;/打開蜂鳴器delay_ms(100); BEEP=0; POINT_COLOR=BLUE;ALIENTEK STM32開發(fā)板AN1616A函數(shù)參數(shù) imagewidth 是圖像尺寸, *imagebuf 為RGB565 圖像數(shù)據(jù)。圖像 RGB565 數(shù)據(jù)需轉(zhuǎn)換成 8 位的灰度數(shù)據(jù)傳入 atk_qr_decode()才能被識別。我們定義了圖像尺寸 imagewidth 高度等于寬
18、度且必須是 240 的倍數(shù),這是因為我們將 8 位灰度圖像申請內(nèi)存放在 CCM 里使得算法運算速度更快一些,且 CCM 只管理 60K 內(nèi)存(在 malloc.h 中),所以最終將輸入識別的圖像壓縮成 240*240=56K 的灰度圖像。大家也可以將內(nèi)存申請只外部 SRAM 這樣就可以隨意定義 imagewidth 的大小了,只是圖像的處理速度會慢一些。在函數(shù)里定義 static u8 bartype=0,使用 static 定義相當(dāng)于靜態(tài)全局變量,不會每次進(jìn)入函數(shù)時 bartype=0;當(dāng)沒識別到數(shù)據(jù)時 bartype+,這樣就可以實現(xiàn)二維碼、CODE128、CODE39、I25、EAN13
19、 輪流識別了。當(dāng) result0!=0 時即識別到了,蜂鳴器“滴”一聲提示,并將識別結(jié)果顯示在 LCD 上及發(fā)送給串口打印。 下面我們來看一下 main.c 中的 qr_dcmi_rx_callback 函數(shù)和 main 函數(shù): 開源電子網(wǎng)2016-07-14u16 qr_image_width;/輸入識別圖像的寬度(長度=寬度) u8readok=0;/采集完一幀數(shù)據(jù)標(biāo)識 u32 *dcmi_line_buf2;/攝像頭采用一行一行讀取,定義行緩存 u16 *rgb_data_buf;/RGB565 幀緩存 bufu16 dcmi_curline=0;/攝像頭輸
20、出數(shù)據(jù),當(dāng)前行編號 /攝像頭數(shù)據(jù) DMA 接收完成中斷回調(diào)函數(shù) void qr_dcmi_rx_callback(void)u32 *pbuf; u16 i;/ 將 rgb_data_buf 地 址 偏 移 賦 值 給 pbuf pbuf=(u32*)(rgb_data_buf+dcmi_curline*qr_image_width); if(DMA2_Stream1-CR&(119)/DMA 使用buf1,讀取 buf0for(i=0;iqr_image_width/2;i+)pbufi=dcmi_line_buf0i;else/DMA 使用 buf0,讀取 buf1for(i=0;i480
21、)qr_image_width=480; if(qr_image_width=320)qr_image_width=240; Show_Str(0,(lcddev.height+qr_image_width)/2+4,240,16,(u8*)識別結(jié)果:,16,1);/為行緩存接收申請內(nèi)存 dcmi_line_buf0=mymalloc(SRAMIN,qr_image_width*2);/為行緩存接收申請內(nèi)存dcmi_line_buf1=mymalloc(SRAMIN,qr_image_width*2);/為 rgb 幀緩存申請內(nèi)存rgb_data_buf=mymalloc(SRAMEX,qr_
22、image_width*qr_image_width*2); dcmi_rx_callback=qr_dcmi_rx_callback;/DMA 數(shù)據(jù)接收中斷回調(diào)函數(shù)DCMI_DMA_Init(u32)dcmi_line_buf0,(u32)dcmi_line_buf1,qr_image_width/2,1,1);/DCMI DMA 配置OV2640_OutSize_Set(qr_image_width,qr_image_width); DCMI_Start();printf(SRAM IN:%drn,my_mem_perused(SRAMIN); printf(SRAM EX:%drn,my
23、_mem_perused(SRAMEX); printf(SRAM CCM:%drn,my_mem_perused(SRAMCCM);atk_qr_init();/初始化識別庫,為算法申請內(nèi)存 printf(1SRAM IN:%drn,my_mem_perused(SRAMIN); printf(1SRAM EX:%drn,my_mem_perused(SRAMEX); printf(1SRAM CCM:%drn,my_mem_perused(SRAMCCM); while(1)key=KEY_Scan(0);/不支持連按if(key)if(key=KEY2_PRES)break;/按 KEY
24、2 結(jié)束識別 if(readok=1)/采集到了一幀圖像 readok=0;LCD_Color_Fill( (lcddev.width-qr_image_width)/2,(lcddev.height-qr_image_ width)/2,(lcddev.width+qr_image_width)/2-1,(lcddev.heigh t+qr_image_width)/2-1,rgb_data_buf );/顯示圖像 qr_decode(qr_image_width,rgb_data_buf);/識別圖像 i+;if(i=20)/DS0 閃爍.i=0;ALIEN
25、TEK STM32開發(fā)板AN1616Aqr_dcmi_rx_callback 函數(shù)是 DMA 中斷回調(diào)函數(shù),當(dāng) DMA 傳輸完成一行圖像數(shù)據(jù)則中斷, 并調(diào)用此函數(shù)。函數(shù)里先判斷當(dāng)前 DMA 傳輸使用的 buf0 還是 buf1,如果是 buf0 說明 buf1 已滿則讀取 buf1 的數(shù)據(jù),并復(fù)制給rgb_data_buf。 Main 函數(shù)首先是初始化時鐘、外設(shè)、硬件等,然后初始化 DCMI,配置 DMA 雙緩沖模式來接收 DCMI 采集的圖像數(shù)據(jù)。這里我們配置 OV5640 為自動連續(xù)對焦模式,并根據(jù)lcddev.width(由 lcd 分辨率確定)來設(shè)置 OV2640 輸出圖像尺寸為 240*240 或 480*480(根據(jù)屏幕分辨率,自動設(shè)置)。因為 DMA 雙緩沖模式需要兩個 buf(緩沖區(qū))輪流接收數(shù)據(jù), 所以我們申請了 dcmi_line_buf0 、1 內(nèi)存來接收圖像的行數(shù)據(jù)。另外我們還申請了rgb_data_buf 內(nèi)存,用于存放一幀 RGB565 圖像數(shù)據(jù)。while 循環(huán)里主要是按鍵掃描KEY_Scan(); 和判斷是否采集到了一幀圖像 if(readok=1),如果采集到了一幀圖像則先顯示了圖像qr_show_imag
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 地震安全課件百度
- 儀器儀表在安防領(lǐng)域的應(yīng)用考核試卷
- 搪瓷制品的企業(yè)文化與品牌效應(yīng)考核試卷
- 商務(wù)代理國際市場營銷渠道開發(fā)考核試卷
- 客戶關(guān)系管理在供應(yīng)鏈中的作用考核試卷
- 成人教育學(xué)習(xí)效果評估考核試卷
- 工業(yè)機(jī)器人法律倫理與社會責(zé)任考核試卷
- 承包母嬰店合同范本
- 簡易訂單合同范本
- 水電售后安裝合同范本
- 小學(xué)生韻母in、ing常見漢字與區(qū)分練習(xí)
- 藥房品種類別及數(shù)量清單
- 機(jī)關(guān)檔案管理工作培訓(xùn)PPT課件
- 初中物理人教版八年級下冊 第1節(jié)牛頓第一定律 課件
- 網(wǎng)站培訓(xùn)內(nèi)容trswcm65表單選件用戶手冊
- 連續(xù)平壓熱壓機(jī) 三篇 俞敏等
- 空調(diào)系統(tǒng)維保記錄表格模板
- 打印版-圓與二次函數(shù)綜合題精練(帶答案)
- 各種閥門CAD圖
- 工程結(jié)算書標(biāo)準(zhǔn)
- 氧氣管道吹掃方案(共7頁)
評論
0/150
提交評論