|
大家可以試著嘗試一下,因?yàn)槭窃创a
單片機(jī)源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "lcd.h"
- #include "usart.h"
- #include "sram.h"
- #include "malloc.h"
- #include "string.h"
- #include "dcmi.h"
- #include "ov2640.h"
- #include "led.h"
- #include "key.h"
- #include "beep.h"
- #include "sdio_sdcard.h"
- #include "ff.h"
- #include "w25qxx.h"
- #include "exfuns.h"
- #include "fontupd.h"
- #include "text.h"
- #include "atk_qrdecode.h"
- u16 qr_image_width; //輸入識(shí)別圖像的寬度(長(zhǎng)度=寬度)
- u8 readok=0; //采集完一幀數(shù)據(jù)標(biāo)識(shí)
- u32 *dcmi_line_buf[2]; //攝像頭采用一行一行讀取,定義行緩存
- u16 *rgb_data_buf; //RGB565幀緩存buf
- u16 dcmi_curline=0; //攝像頭輸出數(shù)據(jù),當(dāng)前行編號(hào)
- //攝像頭數(shù)據(jù)DMA接收完成中斷回調(diào)函數(shù)
- void qr_dcmi_rx_callback(void)
- {
- u32 *pbuf;
- u16 i;
- pbuf=(u32*)(rgb_data_buf+dcmi_curline*qr_image_width);//將rgb_data_buf地址偏移賦值給pbuf
-
- if(DMA2_Stream1->CR&(1<<19))//DMA使用buf1,讀取buf0
- {
- for(i=0;i<qr_image_width/2;i++)
- {
- pbuf[i]=dcmi_line_buf[0][i];
- }
- }else //DMA使用buf0,讀取buf1
- {
- for(i=0;i<qr_image_width/2;i++)
- {
- pbuf[i]=dcmi_line_buf[1][i];
- }
- }
- dcmi_curline++;
- }
- //imagewidth:<=240;大于240時(shí),是240的整數(shù)倍
- //imagebuf:RGB圖像數(shù)據(jù)緩沖區(qū)
- void qr_decode(u16 imagewidth,u16 *imagebuf)
- {
- static u8 bartype=0;
- u8 *bmp;
- u8 *result=NULL;
- u16 Color;
- u16 i,j;
- u16 qr_img_width=0; //輸入識(shí)別器的圖像寬度,最大不超過(guò)240!
- u8 qr_img_scale=0; //壓縮比例因子
-
- if(imagewidth>240)
- {
- if(imagewidth%240)return ; //不是240的倍數(shù),直接退出
- qr_img_width=240;
- qr_img_scale=imagewidth/qr_img_width;
- }else
- {
- qr_img_width=imagewidth;
- qr_img_scale=1;
- }
- result=mymalloc(SRAMIN,1536);//申請(qǐng)識(shí)別結(jié)果存放內(nèi)存
- bmp=mymalloc(SRAMCCM,qr_img_width*qr_img_width);//CCM管理內(nèi)存為60K,這里最大可申請(qǐng)240*240=56K
- mymemset(bmp,0,qr_img_width*qr_img_width);
- for(i=0;i<qr_img_width;i++)
- {
- for(j=0;j<qr_img_width;j++) //將RGB565圖片轉(zhuǎn)成灰度
- {
- Color=*(imagebuf+((i*imagewidth)+j)*qr_img_scale); //按照qr_img_scale壓縮成240*240
- *(bmp+i*qr_img_width+j)=(((Color&0xF800)>> 8)*76+((Color&0x7E0)>>3)*150+((Color&0x001F)<<3)*30)>>8;
- }
- }
- atk_qr_decode(qr_img_width,qr_img_width,bmp,bartype,result);//識(shí)別灰度圖片(注意:?jiǎn)未魏臅r(shí)約0.2S)
-
- if(result[0]==0)//沒(méi)有識(shí)別出來(lái)
- {
- bartype++;
- if(bartype>=5)bartype=0;
- }
- else if(result[0]!=0)//識(shí)別出來(lái)了,顯示結(jié)果
- {
- BEEP=1;//打開(kāi)蜂鳴器
- delay_ms(100);
- BEEP=0;
- POINT_COLOR=BLUE;
- LCD_Fill(0,(lcddev.height+qr_image_width)/2+20,lcddev.width,lcddev.height,BLACK);
- Show_Str(0,(lcddev.height+qr_image_width)/2+20,lcddev.width,
- (lcddev.height-qr_image_width)/2-20,(u8*)result,16,0
- );//LCD顯示識(shí)別結(jié)果
- printf("\r\nresult:\r\n%s\r\n",result);//串口打印識(shí)別結(jié)果
- }
- myfree(SRAMCCM,bmp); //釋放灰度圖bmp內(nèi)存
- myfree(SRAMIN,result); //釋放識(shí)別結(jié)果
- }
- int main(void)
- {
- u8 key;
- u8 i;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
- delay_init(168); //初始化延時(shí)函數(shù)
- uart_init(115200);
- LED_Init();
- BEEP_Init();
- KEY_Init();
- LCD_Init();
- FSMC_SRAM_Init(); //初始化外部SRAM.
- my_mem_init(SRAMIN); //初始化內(nèi)部?jī)?nèi)存池
- my_mem_init(SRAMEX); //初始化內(nèi)部?jī)?nèi)存池
- my_mem_init(SRAMCCM); //初始化CCM內(nèi)存池
- W25QXX_Init(); //初始化W25Q128
- POINT_COLOR=RED; //設(shè)置字體為紅色
- LCD_Clear(BLACK);
- while(font_init()) //檢查字庫(kù)
- {
- LCD_ShowString(60,50,lcddev.width,16,16,(u8*)"Font Error!");
- delay_ms(200);
- LCD_Fill(60,50,lcddev.width,66,WHITE);//清除顯示
- delay_ms(200);
- }
- Show_Str_Mid(0,0,(u8*)"探索者F4開(kāi)發(fā)板",16,lcddev.width);
- Show_Str_Mid(0,20,(u8*)"二維碼/條形碼識(shí)別實(shí)驗(yàn)",16,lcddev.width);
- while(OV2640_Init()) //初始化OV2640
- {
- LCD_ShowString(60,50,lcddev.width,16,16,(u8*)"OV2640 Error!");
- delay_ms(200);
- LCD_Fill(60,50,lcddev.width,66,WHITE);//清除顯示
- delay_ms(200);
- }
- OV2640_Special_Effects(0);//正常
- OV2640_RGB565_Mode(); //RGB565模式
- My_DCMI_Init(); //DCMI配置
-
- qr_image_width=lcddev.width;
- if(qr_image_width>480)qr_image_width=480;//這里qr_image_width設(shè)置為240的倍數(shù)
- if(qr_image_width==320)qr_image_width=240;
- Show_Str(0,(lcddev.height+qr_image_width)/2+4,240,16,(u8*)"識(shí)別結(jié)果:",16,1);
-
- dcmi_line_buf[0]=mymalloc(SRAMIN,qr_image_width*2); //為行緩存接收申請(qǐng)內(nèi)存
- dcmi_line_buf[1]=mymalloc(SRAMIN,qr_image_width*2); //為行緩存接收申請(qǐng)內(nèi)存
- rgb_data_buf=mymalloc(SRAMEX,qr_image_width*qr_image_width*2);//為rgb幀緩存申請(qǐng)內(nèi)存
-
- dcmi_rx_callback=qr_dcmi_rx_callback;//DMA數(shù)據(jù)接收中斷回調(diào)函數(shù)
- DCMI_DMA_Init(
- (u32)dcmi_line_buf[0],(u32)dcmi_line_buf[1], \
- qr_image_width/2,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable
- );//DCMI DMA配置
-
- OV2640_OutSize_Set(qr_image_width,qr_image_width);
- DCMI_Start();
- printf("SRAM IN:%d\r\n",my_mem_perused(SRAMIN));
- printf("SRAM EX:%d\r\n",my_mem_perused(SRAMEX));
- printf("SRAM CCM:%d\r\n",my_mem_perused(SRAMCCM));
-
- atk_qr_init();//初始化識(shí)別庫(kù),為算法申請(qǐng)內(nèi)存
-
- printf("1SRAM IN:%d\r\n",my_mem_perused(SRAMIN));
- printf("1SRAM EX:%d\r\n",my_mem_perused(SRAMEX));
- printf("1SRAM CCM:%d\r\n",my_mem_perused(SRAMCCM));
- while(1)
- {
- key=KEY_Scan(0);//不支持連按
- if(key)
- {
- if(key==KEY2_PRES)break;//按KEY2結(jié)束識(shí)別
- }
- 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.height+qr_image_width)/2-1,
- rgb_data_buf );//顯示圖像
-
- qr_decode(qr_image_width,rgb_data_buf);//識(shí)別圖像
-
- }
- i++;
- if(i==20)//DS0閃爍.
- {
- i=0;
- LED0=!LED0;
- }
- }
- atk_qr_destroy();//釋放算法內(nèi)存
- printf("3SRAM IN:%d\r\n",my_mem_perused(SRAMIN));
- printf("3SRAM EX:%d\r\n",my_mem_perused(SRAMEX));
- printf("3SRAM CCM:%d\r\n",my_mem_perused(SRAMCCM));
- while(1)
- {
- LED0=!LED0;
- delay_ms(200);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
(標(biāo)準(zhǔn)庫(kù)版,適合探索者F407開(kāi)發(fā)板)擴(kuò)展實(shí)驗(yàn)SE01 ATK-QR二維碼、條形碼識(shí)別實(shí)驗(yàn).rar
(1.41 MB, 下載次數(shù): 166)
2018-10-19 19:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|