找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6594|回复: 9
收起左侧

stm32f4与ov2640二维码识别源码

  [复制链接]
ID:299647 发表于 2018-10-19 19:54 | 显示全部楼层 |阅读模式
大家可以试着尝试一下,因为是源码

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "lcd.h"
  4. #include "usart.h"
  5. #include "sram.h"   
  6. #include "malloc.h"   
  7. #include "string.h"       
  8. #include "dcmi.h"       
  9. #include "ov2640.h"
  10. #include "led.h"
  11. #include "key.h"
  12. #include "beep.h"
  13. #include "sdio_sdcard.h"  
  14. #include "ff.h"  
  15. #include "w25qxx.h"   
  16. #include "exfuns.h"   
  17. #include "fontupd.h"
  18. #include "text.h"       
  19. #include "atk_qrdecode.h"

  20. u16 qr_image_width;                                                //输入识别图像的宽度(长度=宽度)
  21. u8         readok=0;                                                        //采集完一帧数据标识
  22. u32 *dcmi_line_buf[2];                                        //摄像头采用一行一行读取,定义行缓存  
  23. u16 *rgb_data_buf;                                                //RGB565帧缓存buf
  24. u16 dcmi_curline=0;                                                //摄像头输出数据,当前行编号

  25. //摄像头数据DMA接收完成中断回调函数
  26. void qr_dcmi_rx_callback(void)
  27. {  
  28.         u32 *pbuf;
  29.         u16 i;
  30.         pbuf=(u32*)(rgb_data_buf+dcmi_curline*qr_image_width);//将rgb_data_buf地址偏移赋值给pbuf
  31.        
  32.         if(DMA2_Stream1->CR&(1<<19))//DMA使用buf1,读取buf0
  33.         {
  34.                 for(i=0;i<qr_image_width/2;i++)
  35.                 {
  36.                         pbuf[i]=dcmi_line_buf[0][i];
  37.                 }
  38.         }else                                                                                 //DMA使用buf0,读取buf1
  39.         {
  40.                 for(i=0;i<qr_image_width/2;i++)
  41.                 {
  42.                         pbuf[i]=dcmi_line_buf[1][i];
  43.                 }
  44.         }
  45.         dcmi_curline++;
  46. }

  47. //imagewidth:<=240;大于240时,是240的整数倍
  48. //imagebuf:RGB图像数据缓冲区
  49. void qr_decode(u16 imagewidth,u16 *imagebuf)
  50. {
  51.         static u8 bartype=0;
  52.         u8 *bmp;
  53.         u8 *result=NULL;
  54.         u16 Color;
  55.         u16 i,j;       
  56.         u16 qr_img_width=0;                                                //输入识别器的图像宽度,最大不超过240!
  57.         u8 qr_img_scale=0;                                                //压缩比例因子
  58.        
  59.         if(imagewidth>240)
  60.         {
  61.                 if(imagewidth%240)return ;        //不是240的倍数,直接退出
  62.                 qr_img_width=240;
  63.                 qr_img_scale=imagewidth/qr_img_width;
  64.         }else
  65.         {
  66.                 qr_img_width=imagewidth;
  67.                 qr_img_scale=1;
  68.         }  
  69.         result=mymalloc(SRAMIN,1536);//申请识别结果存放内存
  70.         bmp=mymalloc(SRAMCCM,qr_img_width*qr_img_width);//CCM管理内存为60K,这里最大可申请240*240=56K
  71.         mymemset(bmp,0,qr_img_width*qr_img_width);
  72.         for(i=0;i<qr_img_width;i++)               
  73.         {
  74.                 for(j=0;j<qr_img_width;j++)                //将RGB565图片转成灰度
  75.                 {       
  76.                         Color=*(imagebuf+((i*imagewidth)+j)*qr_img_scale); //按照qr_img_scale压缩成240*240
  77.                         *(bmp+i*qr_img_width+j)=(((Color&0xF800)>> 8)*76+((Color&0x7E0)>>3)*150+((Color&0x001F)<<3)*30)>>8;
  78.                 }               
  79.         }
  80.         atk_qr_decode(qr_img_width,qr_img_width,bmp,bartype,result);//识别灰度图片(注意:单次耗时约0.2S)
  81.        
  82.         if(result[0]==0)//没有识别出来
  83.         {
  84.                 bartype++;
  85.                 if(bartype>=5)bartype=0;
  86.         }
  87.         else if(result[0]!=0)//识别出来了,显示结果
  88.         {       
  89.                 BEEP=1;//打开蜂鸣器
  90.                 delay_ms(100);
  91.                 BEEP=0;
  92.                 POINT_COLOR=BLUE;
  93.                 LCD_Fill(0,(lcddev.height+qr_image_width)/2+20,lcddev.width,lcddev.height,BLACK);
  94.                 Show_Str(0,(lcddev.height+qr_image_width)/2+20,lcddev.width,
  95.                                                                 (lcddev.height-qr_image_width)/2-20,(u8*)result,16,0                                                       
  96.                                                 );//LCD显示识别结果
  97.                 printf("\r\nresult:\r\n%s\r\n",result);//串口打印识别结果                
  98.         }
  99.         myfree(SRAMCCM,bmp);                //释放灰度图bmp内存
  100.         myfree(SRAMIN,result);        //释放识别结果       
  101. }

  102. int main(void)
  103. {                                                 
  104.         u8 key;                                                  
  105.         u8 i;       
  106.        
  107.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  108.         delay_init(168);                          //初始化延时函数
  109.         uart_init(115200);
  110.         LED_Init();
  111.         BEEP_Init();
  112.         KEY_Init();
  113.         LCD_Init();
  114.         FSMC_SRAM_Init();                          //初始化外部SRAM.
  115.         my_mem_init(SRAMIN);                //初始化内部内存池
  116.         my_mem_init(SRAMEX);                //初始化内部内存池  
  117.         my_mem_init(SRAMCCM);                //初始化CCM内存池
  118.         W25QXX_Init();                                  //初始化W25Q128
  119.         POINT_COLOR=RED;        //设置字体为红色
  120.         LCD_Clear(BLACK);       
  121.         while(font_init())                         //检查字库
  122.         {            
  123.                 LCD_ShowString(60,50,lcddev.width,16,16,(u8*)"Font Error!");
  124.                 delay_ms(200);                                  
  125.                 LCD_Fill(60,50,lcddev.width,66,WHITE);//清除显示
  126.                 delay_ms(200);
  127.         }
  128.         Show_Str_Mid(0,0,(u8*)"探索者F4开发板",16,lcddev.width);                                              
  129.         Show_Str_Mid(0,20,(u8*)"二维码/条形码识别实验",16,lcddev.width);       
  130.         while(OV2640_Init())                //初始化OV2640
  131.         {
  132.                 LCD_ShowString(60,50,lcddev.width,16,16,(u8*)"OV2640 Error!");
  133.                 delay_ms(200);                                  
  134.                 LCD_Fill(60,50,lcddev.width,66,WHITE);//清除显示
  135.                 delay_ms(200);
  136.         }       
  137.         OV2640_Special_Effects(0);//正常
  138.         OV2640_RGB565_Mode();                        //RGB565模式
  139.         My_DCMI_Init();                                                //DCMI配置
  140.        
  141.         qr_image_width=lcddev.width;
  142.         if(qr_image_width>480)qr_image_width=480;//这里qr_image_width设置为240的倍数
  143.         if(qr_image_width==320)qr_image_width=240;
  144.         Show_Str(0,(lcddev.height+qr_image_width)/2+4,240,16,(u8*)"识别结果:",16,1);
  145.        
  146.         dcmi_line_buf[0]=mymalloc(SRAMIN,qr_image_width*2);                                                //为行缓存接收申请内存       
  147.         dcmi_line_buf[1]=mymalloc(SRAMIN,qr_image_width*2);                                                //为行缓存接收申请内存
  148.         rgb_data_buf=mymalloc(SRAMEX,qr_image_width*qr_image_width*2);//为rgb帧缓存申请内存
  149.        
  150.         dcmi_rx_callback=qr_dcmi_rx_callback;//DMA数据接收中断回调函数
  151.         DCMI_DMA_Init(
  152.                                                                         (u32)dcmi_line_buf[0],(u32)dcmi_line_buf[1],        \
  153.                                                                         qr_image_width/2,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable                                                                                       
  154.                                                          );//DCMI DMA配置
  155.        
  156.         OV2640_OutSize_Set(qr_image_width,qr_image_width);
  157.         DCMI_Start();
  158.         printf("SRAM IN:%d\r\n",my_mem_perused(SRAMIN));
  159.         printf("SRAM EX:%d\r\n",my_mem_perused(SRAMEX));
  160.         printf("SRAM CCM:%d\r\n",my_mem_perused(SRAMCCM));
  161.        
  162.         atk_qr_init();//初始化识别库,为算法申请内存
  163.        
  164.         printf("1SRAM IN:%d\r\n",my_mem_perused(SRAMIN));
  165.         printf("1SRAM EX:%d\r\n",my_mem_perused(SRAMEX));
  166.         printf("1SRAM CCM:%d\r\n",my_mem_perused(SRAMCCM));
  167.         while(1)
  168.         {       
  169.                 key=KEY_Scan(0);//不支持连按
  170.                 if(key)
  171.                 {
  172.                         if(key==KEY2_PRES)break;//按KEY2结束识别
  173.                 }
  174.                 if(readok==1)                        //采集到了一帧图像
  175.                 {               
  176.                         readok=0;
  177.                         LCD_Color_Fill( (lcddev.width-qr_image_width)/2,(lcddev.height-qr_image_width)/2,        \
  178.                                                                                         (lcddev.width+qr_image_width)/2-1,(lcddev.height+qr_image_width)/2-1,
  179.                                                                                         rgb_data_buf );//显示图像
  180.                        
  181.                         qr_decode(qr_image_width,rgb_data_buf);//识别图像
  182.                        
  183.                 }
  184.                 i++;
  185.                 if(i==20)//DS0闪烁.
  186.                 {
  187.                         i=0;
  188.                         LED0=!LED0;
  189.                 }
  190.         }
  191.         atk_qr_destroy();//释放算法内存
  192.         printf("3SRAM IN:%d\r\n",my_mem_perused(SRAMIN));
  193.         printf("3SRAM EX:%d\r\n",my_mem_perused(SRAMEX));
  194.         printf("3SRAM CCM:%d\r\n",my_mem_perused(SRAMCCM));
  195.         while(1)
  196.         {
  197.                 LED0=!LED0;
  198.                 delay_ms(200);
  199.         }
  200. }
复制代码

所有资料51hei提供下载:
(标准库版,适合探索者F407开发板)扩展实验SE01 ATK-QR二维码、条形码识别实验.rar (1.41 MB, 下载次数: 166)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:251731 发表于 2018-11-1 20:13 | 显示全部楼层
你好,请问你用ov2640采集的图像转灰度后会不会有很多杂点,我现在正在做基于stm32的车牌识别系统,用ov2640摄像头采集图像转黑白后效果不是很好,我用的是将yuv取其y转灰度的
回复

使用道具 举报

ID:441242 发表于 2018-12-19 22:25 | 显示全部楼层
这个会不会有读假点的现象啊
回复

使用道具 举报

ID:378903 发表于 2019-9-10 01:28 | 显示全部楼层
2640的数据需要多大分辨率的呢
回复

使用道具 举报

ID:217614 发表于 2019-9-14 13:41 | 显示全部楼层
非常好谢谢
回复

使用道具 举报

ID:632263 发表于 2019-10-29 20:40 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:427723 发表于 2020-6-16 10:10 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:909679 发表于 2021-4-21 15:08 | 显示全部楼层
你好,请问一下ov2640是怎么采集的
回复

使用道具 举报

ID:923412 发表于 2021-5-18 17:56 | 显示全部楼层
请问,二维码扫描后的数据怎么传输出去呀
回复

使用道具 举报

ID:1061377 发表于 2023-1-18 17:00 | 显示全部楼层
支持,非常好的资料,学习。还不能下载,努力中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表