找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6581|回复: 8
打印 上一主题 下一主题
收起左侧

摄像头二值化 STM32 ov7670源码

  [复制链接]
跳转到指定楼层
楼主
ID:152163 发表于 2017-8-2 20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摄像头二值化 STM32 ov7670

单片机源程序如下:
  1. #include "sys.h"
  2. #include "usart.h"               
  3. #include "delay.h"        
  4. #include "led.h"
  5. #include "usmart.h"
  6. #include "lcd.h"
  7. #include "ov7670.h"
  8. #include "exti.h"
  9. #include "timer.h"
  10. //ALIENTEK Mini STM32开发板扩展实验9
  11. //摄像头实验
  12. extern u8 ov_sta;        //在exit.c里面定义
  13. extern u8 ov_frame;        //在timer.c里面定义
  14. //更新LCD显示
  15. void camera_refresh(void)
  16. {
  17.         u32 j,i=0;
  18.          u16 color;
  19.     u16 x[320],y[240],m,n;  
  20.     u16 Xmin,Xmax,Ymin,Ymax;        
  21.         if(ov_sta==2)
  22.         {
  23.                 LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右
  24.                 LCD_SetCursor(0x00,0x0000);        //设置光标位置
  25.                 LCD_WriteRAM_Prepare();     //开始写入GRAM        
  26.                  OV7670_CS=0;         
  27.                  OV7670_RRST=0;                                //开始复位读指针
  28.                 OV7670_RCK=0;
  29.                 OV7670_RCK=1;
  30.                 OV7670_RCK=0;
  31.                 OV7670_RRST=1;                                //复位读指针结束
  32.                 OV7670_RCK=1;  
  33.                 for(j=0;j<76800;j++)
  34.                 {
  35.                         GPIOB->CRL=0X88888888;                  
  36.                         OV7670_RCK=0;
  37.                         color=OV7670_DATA;                //读数据
  38.                         OV7670_RCK=1;         
  39.                         color<<=8;                                          
  40.                          OV7670_RCK=0;
  41.                         color|=OV7670_DATA;                //读数据                  
  42.                         OV7670_RCK=1;
  43.                         GPIOB->CRL=0X33333333;
  44.             if(color<25000)
  45.             {
  46.                 color=0x0000;
  47.                 m=j%320;
  48.                 n=j/320;
  49.                 if(i==0)
  50.                 {
  51.                     x[i]=m;
  52.                     y[i]=n;
  53.                     Xmin=m;
  54.                     Xmax=m;
  55.                     Ymin=n;
  56.                     Ymax=n;
  57.                     i++;                    
  58.                 }
  59.                 x[i]=m;
  60.                 y[i]=n;
  61.                 if((x[i]-x[i-1])<50&&(y[i]-y[i-1])<50)
  62.                 {
  63.                     if((x[i]<315)&&(x[i]>5)&&(y[i]<235)&&(y[i]>5))
  64.                     {                        
  65.                         if(x[i]>Xmax)
  66.                             Xmax=x[i];
  67.                         if(x[i]<Xmin)
  68.                             Xmin=x[i];
  69.                         if(y[i]>Ymax)
  70.                             Ymax=y[i];
  71.                         if(y[i]<Ymin)
  72.                             Ymin=y[i];
  73.                         i++;
  74.                     }
  75.                 }                              
  76.             }
  77.             else
  78.                 color=0xFFFF;                     
  79.                         LCD_WR_DATA(color);         
  80.                 }
  81.         POINT_COLOR=RED;
  82.         LCD_DrawRectangle(Xmin,Ymin,Xmax,Ymax);        
  83.                  OV7670_CS=1;                                                         
  84.                 OV7670_RCK=0;
  85.                 OV7670_RCK=1;
  86.                 EXTI->PR=1<<15;                     //清除LINE8上的中断标志位
  87.                 ov_sta=0;                                        //开始下一次采集
  88.                  ov_frame++;
  89.                 LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向                                                     
  90.         }
  91. }         
  92. int main(void)
  93. {        
  94.         u8 i;        
  95.         delay_init();                     //延时函数初始化
  96.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
  97.         uart_init(9600);
  98.         OV7670_Init();        
  99.         LED_Init();                                  //初始化与LED连接的硬件接口
  100.         LCD_Init();                                   //初始化LCD
  101.         if(lcddev.id==0X6804||lcddev.id==0X5310||lcddev.id==0X5510||lcddev.id==0X1963) //强制设置屏幕分辨率为320*240.以支持3.5寸大屏
  102.         {
  103.                 lcddev.width=240;
  104.                 lcddev.height=320;
  105.         }
  106.         usmart_dev.init(72);        //初始化USMART        
  107.         
  108.          POINT_COLOR=RED;//设置字体为红色
  109.         LCD_ShowString(60,50,200,200,16,"Mini STM32");        
  110.         LCD_ShowString(60,70,200,200,16,"OV7670 TEST");        
  111.         LCD_ShowString(60,90,200,200,16,"ATOM@ALIENTEK");
  112.         LCD_ShowString(60,110,200,200,16,"2014/3/27");           
  113.         LCD_ShowString(60,130,200,200,16,"Use USMART To Set!");         
  114.           LCD_ShowString(60,150,200,200,16,"OV7670 Init...");         
  115.         while(OV7670_Init())//初始化OV7670
  116.         {
  117.                 LCD_ShowString(60,150,200,200,16,"OV7670 Error!!");
  118.                 delay_ms(200);
  119.             LCD_Fill(60,150,239,166,WHITE);
  120.                 delay_ms(200);
  121.         }
  122.          LCD_ShowString(60,150,200,200,16,"OV7670 Init OK");
  123.         delay_ms(1500);                              
  124.         TIM3_Int_Init(10000,7199);                        //TIM3,10Khz计数频率,1秒钟中断                                                                          
  125.         EXTI15_Init();                                                //使能定时器捕获
  126.         OV7670_Window_Set(10,174,240,320);        //设置窗口         
  127.           OV7670_CS=0;                                                         
  128.          while(1)
  129.         {        
  130.                  camera_refresh();        //更新显示         
  131.                  if(i!=ov_frame)                //DS0闪烁.
  132.                 {
  133.                         i=ov_frame;
  134.                         LED0=!LED0;
  135.                  }
  136.         }           
  137. }

复制代码
所有资料51hei提供下载:
扩展实验9 摄像头实验.rar (377.9 KB, 下载次数: 141)



评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:222119 发表于 2017-8-5 16:41 | 只看该作者
正需要二值化的程序,谢谢
回复

使用道具 举报

板凳
ID:225534 发表于 2017-8-7 16:44 | 只看该作者
程序很好
回复

使用道具 举报

地板
ID:226390 发表于 2017-8-10 09:21 | 只看该作者
二值化之后怎么读他的数据啊
回复

使用道具 举报

5#
ID:257307 发表于 2017-12-8 18:11 | 只看该作者
为什么我二值化之后LCD不刷新了

回复

使用道具 举报

6#
ID:278640 发表于 2018-1-22 16:11 | 只看该作者
学习了
回复

使用道具 举报

7#
ID:359434 发表于 2018-6-26 15:53 | 只看该作者
谢谢LZ
回复

使用道具 举报

8#
ID:473192 发表于 2019-7-15 17:23 | 只看该作者
感谢分享
回复

使用道具 举报

9#
ID:371387 发表于 2019-7-29 09:55 | 只看该作者
楼主,我想知道,这一段有什么用
m=j%320;
                n=j/320;
                if(i==0)
                {
                    x[i]=m;
                    y[i]=n;
                    Xmin=m;
                    Xmax=m;
                    Ymin=n;
                    Ymax=n;
                    i++;                    
                }
                x[i]=m;
                y[i]=n;
                if((x[i]-x[i-1])<50&&(y[i]-y[i-1])<50)
                {
                    if((x[i]<315)&&(x[i]>5)&&(y[i]<235)&&(y[i]>5))
                    {                        
                        if(x[i]>Xmax)
                            Xmax=x[i];
                        if(x[i]<Xmin)
                            Xmin=x[i];
                        if(y[i]>Ymax)
                            Ymax=y[i];
                        if(y[i]<Ymin)
                            Ymin=y[i];
                        i++;
                    }
                }  
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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