久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4902|回復: 1
收起左側

利用STM32控制ov2640軟件二值化源碼

[復制鏈接]
ID:334654 發表于 2018-5-21 09:44 | 顯示全部樓層 |閱讀模式
利用STM32控制ov2640軟件二值化采集數據,進行圖像識別,可以操作機械臂

本實驗將實現如下功能:開機后,初始化攝像頭模塊(OV2640),如果初始化成功,則提示選擇模式:RGB565模式,或者JPEG模式。KEY0用于選擇RGB565模式,KEY1用于選擇JPEG模式。

    當使用RGB565時,輸出圖像(固定為:UXGA)將經過縮放處理(完全由OV2640的DSP控制),顯示在LCD上面。我們可以通過KEY_UP按鍵選擇:1:1顯示,即不縮放,圖片不變形,但是顯示區域。ㄒ壕Х直媛蚀笮。蛘呖s放顯示,即將1600*1200的圖像壓縮到液晶分辨率尺寸顯示,圖片變形,但是顯示了整個圖片內容。通過KE0Y按鍵,可以設置對比度;KEY1按鍵,可以設置飽和度;KEY2按鍵,可以設置特效。

    當使用JPEG模式時,圖像可以設置任意尺寸(QQVGA~UXGA),采集到的JPEG數據將先存放到STM32F4的內存里面,每當采集到一幀數據,就會關閉DMA傳輸,然后將采集到的數據發送到串口2(此時可以通過上位機軟件(串口攝像頭.exe)接收,并顯示圖片),之后再重新啟動DMA傳輸。我們可以通過KEY_UP設置輸出圖片的尺寸(QQVGA~UXGA)。通過KEY0按鍵,可以設置對比度;KEY1按鍵,可以設置飽和度;KEY2按鍵,可以設置特效。
   

注意:本實驗需要有ALIENTEK OV2640攝像頭模塊才可以做。


單片機源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "key.h"
  6. #include "fing.h"
  7. #include "lcd.h"
  8. #include "usmart.h"  
  9. #include "usart2.h"  
  10. #include "timer.h"
  11. #include "ov2640.h"
  12. #include "dcmi.h"

  13. u8 ov2640_mode=0;                                                //工作模式:0,RGB565模式;1,JPEG模式
  14. u8 x=174,wide=51,mode=0,stop=1;
  15. u8 tempdrum[4][201];
  16. u8 delaytime=50,time=0;

  17. #define jpeg_buf_size 31*1024                          //定義JPEG數據緩存jpeg_buf的大小(*4字節)
  18. __align(4) u32 jpeg_buf[jpeg_buf_size];        //JPEG數據緩存buf
  19. volatile u32 jpeg_data_len=0;                         //buf中的JPEG有效數據長度
  20. volatile u8 jpeg_data_ok=0;                                //JPEG數據采集完成標志
  21.                                                                                 //0,數據沒有采集完;
  22.                                                                                 //1,數據采集完了,但是還沒處理;
  23.                                                                                 //2,數據已經處理完成了,可以開始下一幀接收

  24. void jpeg_data_process(void)
  25. {
  26.         if(ov2640_mode)//只有在JPEG格式下,才需要做處理.
  27.         {
  28.                 if(jpeg_data_ok==0)        //jpeg數據還未采集完?
  29.                 {       
  30.                         DMA_Cmd(DMA2_Stream1, DISABLE);//停止當前傳輸
  31.                         while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置  
  32.                         jpeg_data_len=jpeg_buf_size-DMA_GetCurrDataCounter(DMA2_Stream1);//得到此次數據傳輸的長度
  33.                                
  34.                         jpeg_data_ok=1;                                 //標記JPEG數據采集完按成,等待其他函數處理
  35.                 }
  36.                 if(jpeg_data_ok==2)        //上一次的jpeg數據已經被處理了
  37.                 {
  38.                         DMA2_Stream1->NDTR=jpeg_buf_size;       
  39.                         DMA_SetCurrDataCounter(DMA2_Stream1,jpeg_buf_size);//傳輸長度為jpeg_buf_size*4字節
  40.                         DMA_Cmd(DMA2_Stream1, ENABLE);                        //重新傳輸
  41.                         jpeg_data_ok=0;                                                //標記數據未采集
  42.                 }
  43.         }
  44. }

  45. void KeyMode()
  46. {
  47.                 u8 msgbuf2[20];

  48.         DCMI_Stop(); //停止顯示
  49.        

  50.        
  51.         if(WK_UP==1)
  52.         {
  53.                 mode+=1;
  54.                 if(mode==3)
  55.                 {
  56.                         mode=0;
  57.                         sprintf((char*)msgbuf2,"x=%d w=%d",x,wide);//g
  58.                    LCD_ShowString(200,200,100,16,16,msgbuf2);//顯示提示內容
  59.     }
  60.                 sprintf((char*)msgbuf2,"mode=%d",mode);//g
  61.                 LCD_ShowString(200,220,100,16,16,msgbuf2);//顯示提示內容
  62.                 while(WK_UP==1);
  63.         }

  64.                        
  65.        
  66.        

  67. if(mode==1)
  68. {
  69.                

  70.                         if(KEY0==0)
  71.         {
  72.                 x+=1;
  73.           sprintf((char*)msgbuf2,"   x=%d   ",x);//g
  74.                 LCD_ShowString(200,200,100,16,16,msgbuf2);//顯示提示內容
  75.                 while(KEY0==0);
  76.         }
  77.                         if(KEY2==0)
  78.         {
  79.                 x-=1;
  80.            sprintf((char*)msgbuf2,"   x=%d   ",x);//g
  81.                 LCD_ShowString(200,200,100,16,16,msgbuf2);//顯示提示內容
  82.                 while(KEY2==0);
  83.         }
  84. }
  85. if(mode==2)
  86. {

  87.                 if(KEY0==0)
  88.         {
  89.                 wide+=1;
  90.                 sprintf((char*)msgbuf2,"  w=%d   ",wide);//g
  91.                 LCD_ShowString(200,200,100,16,16,msgbuf2);//顯示提示內容
  92.                 while(KEY0==0);
  93.         }
  94.                         if(KEY2==0)
  95.         {
  96.                 wide-=1;
  97.                 sprintf((char*)msgbuf2,"  w=%d   ",wide);//g
  98.                 LCD_ShowString(200,200,100,16,16,msgbuf2);//顯示提示內容
  99.                 while(KEY0==0);
  100.         }
  101. }
  102. if(mode==0)
  103. {

  104.                 if(KEY0==0)
  105.         {
  106.                 delaytime+=1;
  107.                 sprintf((char*)msgbuf2,"  w=%d   ",delaytime);//g
  108.                 LCD_ShowString(200,220,100,16,16,msgbuf2);//顯示提示內容
  109.                 while(KEY0==0);
  110.         }
  111.                         if(KEY2==0)
  112.         {
  113.                 delaytime-=1;
  114.                 sprintf((char*)msgbuf2,"  w=%d   ",delaytime);//g
  115.                 LCD_ShowString(200,220,100,16,16,msgbuf2);//顯示提示內容
  116.                 while(KEY0==0);
  117.         }
  118. }


  119.                         DCMI_Start();
  120. }

  121. void getcolor(tx,ty,num)
  122. {

  123.         u8 msgbuf1[15];        //消息緩存區

  124.         u16 tempcolor;

  125.       
  126.                  
  127.                   DCMI_Stop(); //停止顯示
  128.                         tempcolor=LCD_ReadPoint(tx,ty);
  129.                   
  130.             sprintf((char*)msgbuf1,"%d",(int) ((tempcolor>>5&0x3f) * 255.0 / 63.0 + 0.5));//g
  131.                   LCD_ShowString(tx-8,ty+24,210,16,16,msgbuf1);//顯示提示內容
  132.        

  133.         if((int) ((tempcolor>>5&0x3f) * 255.0 / 63.0 + 0.5)>30)   //軟件二值化
  134.         {
  135.           LCD_Fill((num-1)*120+1,150-20,num*120-1,150+20,WHITE);
  136.     tempdrum[num-1][time]=1;
  137.         }
  138.         else
  139.         {
  140.           LCD_Fill((num-1)*120+1,150-20,num*120-1,150+20,BLACK);
  141.     tempdrum[num-1][time]=0;
  142.         }
  143.                

  144.                
  145.                   LCD_DrawRectangle(tx-1,ty-1, tx+1, ty+1);
  146.                         LCD_DrawLine(tx, ty-2, tx, ty-7);
  147.                         LCD_DrawLine(tx-2, ty, tx-7, ty);
  148.                         LCD_DrawLine(tx+2, ty, tx+7, ty);               

  149. //          
  150. //                        while(KEY_Scan(0))
  151. //                        KeyMode();

  152.                         DCMI_Start();

  153. //低字節的前5位用來表示B(BLUE)
  154. //低字節的后三位+高字節的前三位用來表示G(Green)
  155. //高字節的后5位用來表示R(RED)               

  156. // R8 = (int) floor( R5 * 255.0 / 31.0 + 0.5);
  157. // G8 = (int) floor( G6 * 255.0 / 63.0 + 0.5);
  158. // B8 = (int) floor( R5 * 255.0 / 31.0 + 0.5);

  159. // R8 = (int) floor( (tempcolor>>11) * 255.0 / 31.0 + 0.5);
  160. // G8 = (int) floor((tempcolor>>5&0x3f) * 255.0 / 63.0 + 0.5);
  161. // B8 = (int) floor( (tempcolor&0x1f) * 255.0 / 31.0 + 0.5);
  162.                
  163.         //        delay_ms(1);       

  164. }

  165. //RGB565測試
  166. //RGB數據直接顯示在LCD上面
  167. void fing()
  168. {
  169. u16 temptime;
  170.         if (time<delaytime)temptime=time+201-delaytime;
  171.         else temptime=time-delaytime;
  172.        
  173.                 if(tempdrum[0][temptime]==1)GPIO_SetBits(GPIOG,GPIO_Pin_2);
  174.            else                       GPIO_ResetBits(GPIOG,GPIO_Pin_2);
  175.                 if(tempdrum[1][temptime]==1)GPIO_SetBits(GPIOG,GPIO_Pin_4);
  176.            else                       GPIO_ResetBits(GPIOG,GPIO_Pin_4);
  177.                 if(tempdrum[2][temptime]==1)GPIO_SetBits(GPIOG,GPIO_Pin_6);
  178.            else                       GPIO_ResetBits(GPIOG,GPIO_Pin_6);
  179.                 if(tempdrum[3][temptime]==1)GPIO_SetBits(GPIOG,GPIO_Pin_8);
  180.      else                       GPIO_ResetBits(GPIOG,GPIO_Pin_8);
  181. }
  182. void rgb565_test()
  183. {

  184.         u8 effect=0,saturation=2,contrast=2;
  185.         u8 scale=1;                //默認是全尺寸縮放
  186.         u8 msgbuf[15];        //消息緩存區
  187. //                u8 msgbuf2[15];        //消息緩存區
  188.         u16 tempx;
  189.        
  190.         LCD_Clear(BLACK);
  191.   POINT_COLOR=RED;

  192.         OV2640_RGB565_Mode();        //RGB565模式
  193.         My_DCMI_Init();                        //DCMI配置
  194. //OV2640_Window_Set(0,0,lcddev.width,lcddev.height/4);
  195.         DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA配置  
  196.   OV2640_ImageWin_Set((800-lcddev.width)/2,(800-lcddev.height/4)/2,lcddev.width,lcddev.height/8);//1:1真實尺寸


  197.         OV2640_OutSize_Set(480,lcddev.height/8);


  198.   delay_ms(800);

  199.                
  200.   DCMI_Start();                 //啟動傳輸

  201.        
  202.         while(1)
  203.         {
  204.    
  205.     tempx=x;
  206.        
  207.     getcolor(tempx,20,1);
  208.                 tempx+=wide;
  209.                 getcolor(tempx,20,2);
  210.                 tempx+=wide;
  211.                 getcolor(tempx,20,3);
  212.                 tempx+=wide;
  213.                 getcolor(tempx,20,4);
  214.                
  215.                 fing();
  216.                 time++;
  217.                 if(time>200)time=0;
  218.                
  219.                 if(KEY_Scan(0))
  220.     KeyMode();

  221.         }   
  222. }


  223. int main(void)
  224. {
  225.         u8 key;
  226.         u8 t;

  227.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
  228.         delay_init(168);  //初始化延時函數
  229.         uart_init(115200);                //初始化串口波特率為115200
  230.         usart2_init(42,115200);                //初始化串口2波特率為115200
  231.         LED_Init();                                        //初始化LED
  232.         LCD_Init();                                        //LCD初始化  
  233.         KEY_Init();                                        //按鍵初始化
  234.         FINE_Init();
  235.         TIM3_Int_Init(10000-1,8400-1);//10Khz計數,1秒鐘中斷一次
  236.        
  237.         usmart_dev.init(84);                //初始化USMART
  238.         POINT_COLOR=RED;//設置字體為紅色
  239.          
  240.         while(OV2640_Init())//初始化OV2640
  241.         {
  242.                 LCD_ShowString(30,130,240,16,16,"OV2640 ERR");
  243.                 delay_ms(200);
  244.             LCD_Fill(30,130,239,170,WHITE);
  245.                 delay_ms(200);
  246.         }
  247.         LCD_ShowString(30,130,200,16,16,"OV2640 OK");            

  248.         while(1)
  249.         {       

  250.    rgb565_test();

  251.                   
  252.         }
  253. }
  254.        
復制代碼

所有資料51hei提供下載:
攝像頭采集程序.rar (575.18 KB, 下載次數: 61)
回復

使用道具 舉報

ID:225110 發表于 2018-6-17 13:16 | 顯示全部樓層
圖像顯示只能顯示一小部分
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久久久久久久久久久久 | 丝袜 亚洲 另类 欧美 综合 | 国产91在线播放 | 中文字幕一区二区三区不卡 | 国产高清精品一区二区三区 | 成人在线视频网址 | 久久久久亚洲国产| 欧美国产日韩在线观看 | 日韩a| 日产久久 | 国产在线视频一区 | 春色av| 狠狠亚洲 | 国产精品theporn | 久久国产精品精品国产色婷婷 | 最新日韩在线 | 欧美成人a | 日韩免费在线观看视频 | 在线一区视频 | 成人久草 | 91精品国产日韩91久久久久久 | 国产一区二区精品在线 | 亚洲精品欧美 | 久久久久久久综合 | 99re在线播放 | 欧美精品一区二区在线观看 | 一级黄色片网址 | 国产一区二区三区四区 | 中国一级大毛片 | 国产一区二区三区 | 成人精品国产一区二区4080 | 欧美激情久久久 | 古典武侠第一页久久777 | 欧美一区二区免费电影 | 北条麻妃一区二区三区在线观看 | 国产一二三区电影 | 欧美a在线看 | 成人三级电影 | 国产91视频一区二区 | 欧美一级特黄aaa大片在线观看 | 一本一道久久a久久精品蜜桃 |