欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
stm32f4與ov2640二維碼識別源碼
[打印本頁]
作者:
等多家
時間:
2018-10-19 19:54
標題:
stm32f4與ov2640二維碼識別源碼
大家可以試著嘗試一下,因為是源碼
單片機源程序如下:
#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; //輸入識別圖像的寬度(長度=寬度)
u8 readok=0; //采集完一幀數據標識
u32 *dcmi_line_buf[2]; //攝像頭采用一行一行讀取,定義行緩存
u16 *rgb_data_buf; //RGB565幀緩存buf
u16 dcmi_curline=0; //攝像頭輸出數據,當前行編號
//攝像頭數據DMA接收完成中斷回調函數
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時,是240的整數倍
//imagebuf:RGB圖像數據緩沖區
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; //輸入識別器的圖像寬度,最大不超過240!
u8 qr_img_scale=0; //壓縮比例因子
if(imagewidth>240)
{
if(imagewidth%240)return ; //不是240的倍數,直接退出
qr_img_width=240;
qr_img_scale=imagewidth/qr_img_width;
}else
{
qr_img_width=imagewidth;
qr_img_scale=1;
}
result=mymalloc(SRAMIN,1536);//申請識別結果存放內存
bmp=mymalloc(SRAMCCM,qr_img_width*qr_img_width);//CCM管理內存為60K,這里最大可申請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圖片轉成灰度
{
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);//識別灰度圖片(注意:單次耗時約0.2S)
if(result[0]==0)//沒有識別出來
{
bartype++;
if(bartype>=5)bartype=0;
}
else if(result[0]!=0)//識別出來了,顯示結果
{
BEEP=1;//打開蜂鳴器
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顯示識別結果
printf("\r\nresult:\r\n%s\r\n",result);//串口打印識別結果
}
myfree(SRAMCCM,bmp); //釋放灰度圖bmp內存
myfree(SRAMIN,result); //釋放識別結果
}
int main(void)
{
u8 key;
u8 i;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
delay_init(168); //初始化延時函數
uart_init(115200);
LED_Init();
BEEP_Init();
KEY_Init();
LCD_Init();
FSMC_SRAM_Init(); //初始化外部SRAM.
my_mem_init(SRAMIN); //初始化內部內存池
my_mem_init(SRAMEX); //初始化內部內存池
my_mem_init(SRAMCCM); //初始化CCM內存池
W25QXX_Init(); //初始化W25Q128
POINT_COLOR=RED; //設置字體為紅色
LCD_Clear(BLACK);
while(font_init()) //檢查字庫
{
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開發板",16,lcddev.width);
Show_Str_Mid(0,20,(u8*)"二維碼/條形碼識別實驗",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設置為240的倍數
if(qr_image_width==320)qr_image_width=240;
Show_Str(0,(lcddev.height+qr_image_width)/2+4,240,16,(u8*)"識別結果:",16,1);
dcmi_line_buf[0]=mymalloc(SRAMIN,qr_image_width*2); //為行緩存接收申請內存
dcmi_line_buf[1]=mymalloc(SRAMIN,qr_image_width*2); //為行緩存接收申請內存
rgb_data_buf=mymalloc(SRAMEX,qr_image_width*qr_image_width*2);//為rgb幀緩存申請內存
dcmi_rx_callback=qr_dcmi_rx_callback;//DMA數據接收中斷回調函數
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();//初始化識別庫,為算法申請內存
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結束識別
}
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);//識別圖像
}
i++;
if(i==20)//DS0閃爍.
{
i=0;
LED0=!LED0;
}
}
atk_qr_destroy();//釋放算法內存
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);
}
}
復制代碼
所有資料51hei提供下載:
(標準庫版,適合探索者F407開發板)擴展實驗SE01 ATK-QR二維碼、條形碼識別實驗.rar
(1.41 MB, 下載次數: 166)
2018-10-19 19:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
萌新123
時間:
2018-11-1 20:13
你好,請問你用ov2640采集的圖像轉灰度后會不會有很多雜點,我現在正在做基于stm32的車牌識別系統,用ov2640攝像頭采集圖像轉黑白后效果不是很好,我用的是將yuv取其y轉灰度的
作者:
1148578493
時間:
2018-12-19 22:25
這個會不會有讀假點的現象啊
作者:
hnytzy
時間:
2019-9-10 01:28
2640的數據需要多大分辨率的呢
作者:
router123
時間:
2019-9-14 13:41
非常好謝謝
作者:
h000j
時間:
2019-10-29 20:40
非常感謝
作者:
jinniuxing88888
時間:
2020-6-16 10:10
謝謝分享!
作者:
2715094003
時間:
2021-4-21 15:08
你好,請問一下ov2640是怎么采集的
作者:
woshisanbing
時間:
2021-5-18 17:56
請問,二維碼掃描后的數據怎么傳輸出去呀
作者:
hetingting
時間:
2023-1-18 17:00
支持,非常好的資料,學習。還不能下載,努力中
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1