STM32
直播中

王伟

7年用户 1492经验值
私信 关注
[问答]

如何去开发一种基于stm32和OV7670的摄像头呢

摄像头成像的原理是什么?
摄像头的基本结构是如何构成的?
如何去开发一种基于STM32和OV7670的摄像头呢?

回帖(1)

何柳青

2021-11-15 11:47:16
  第一次写文章,有什么不对的地方,还望各位多多指出-
  学习知识内容:
  *** 摄像头原理+OV7670开发手册* IIC通信(软件)* OV7670初始化程序和获取图像程序* lcd液晶初始化程序* 主函数编写** 整体开发流程:
  
  一。摄像头成像,组成原理
  摄像头的设计与人的眼睛成像原理一致
  
  camera的成像框架
  
  景物通过凸镜头反射聚焦到感光片(CCD/CMOS:图像传感器)中,感光片产生电荷传导自ADC进行数模信号转换,形成RAW颜色数据,经过ISP图像处理算法(变成RGB,YUV常见的像素颜色格式)储存到相应的储存其中,在让CPU读取显示到相应的显示设备中
  二。 摄像头基本结构
  摄像头结构组成:
  Lens:镜头,负责成像和对焦
  Holder:基座,负责固定镜头
  IR:红外滤波片,负责过滤红外光(滤除人不可见的波)
  Sensor:图像传感器,负责将图像转换电信号
  PCB:印刷电路板,负责供电控制及信号传输
  FPC:可绕性印刷电路板,负责接口
  马达:用来改变像距
  三。介绍几个摄像头核心
  图像传感器CCD,CMOS
  CCD就像传统相机的底片一样的感光系统,是感应光线的电路装置,你可以将它想象成一颗颗微小的感应粒子,铺满在光学镜头后方,当光线与图像从镜头透过、投射到CCD表面产生电流,将感应到的内容转换成数码资料储存起来。CCD像素数目越多、单一像素尺寸越大,收集到的图像就会越清晰
  CCD:好用,图像更清晰,公益复杂,贵
  CMOS:便宜,简单,图像质量较差
  
  电荷耦合器件(CCD)原理简单。我们可以把它想象成一个没有盖子的记忆芯片。撞击记忆单元的光子在这些单元中产生电子(光电效应),因此光子的数目与电子的数目互成比例(光的明暗)。然而光子的波长(颜色)并没有被转换为电子。换言之,CCD 裸芯片实际上没有把色彩信息转换为任何形式的电信号。拍摄出来的照片是黑白的!(那为啥能得到彩色数据?)
  大多数相机的方案:拜尔滤光片(马赛克滤波片)+单CCD+算法插值(ISP运算)。 拜尔滤光片使每个像素只能产生红、绿或蓝三色当中一种颜色的值。但是在输出时,由相机处理单元执行空间色彩插值法,使每个像素均包含三基色的成分。
  拜尔滤光片原理
  
  
  拜尔滤光片使每个像素只能产生红、绿或蓝三色当中一种颜色的值
  如
  
  通过拜尔滤光片的值为:
  
  由于人对红色光不敏感,对绿色光敏感,所以拜尔滤光片的色彩比为:红:绿:蓝 = 1:2:1
  所以为了得到真实色彩值,红和蓝的算法一样,和绿不一样。
  ISP图像处理算法
  原始的数据图像经过ISP颜色差算法,算出正确的颜色数据(RGB为一个字,所以ISP中有数据格式的转变,
  RAW-》RGB,YUV)
  
  二.OV7670摄像头模块 -《PZ-0V7670 摄像头模块开发手册》
  使用的设备:普中STM32F103学习版与之配套的OV7670摄像头,lcd液晶屏和原理图资料
  内容:
  1 OV7670 介绍
  2 硬件设计
  3 软件设计
  4 实验现象
  OV7670 简单简介(更多信息查看相应的开发手册)
  通过 SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分
  辨率 8 位影像数据。该产品 VGA 图像最高达到 30 帧/秒。用户可以完全控制
  图像质量、数据格式和传输方式。
  
  描述的是 OV7670/OV7171 图像传感器的功能模块,包括:****(加粗为比较重要的模块**)**
  ●感光阵列(Image Array)(共有 656x488 个像素,其中在 YUV 的模式中,有效像素为 640x480 个)(cmos)
  ●模拟信号处理理( Analog Processing)
  ●A/D 转换
  ●测试图案发生器器( Test Pattern Generator)
  ●数字信号处理器(DSP)
  ●图像缩放( Image Scaler)
  ●时序发生器( Video Timing Generator)内部信号发生器和分布、帧率时序、自动曝光控制、输出外部时序( VSYNC、HREF/HSYNC 和 PCLK)。
  ●数字视频端口( Digital Video Port)
  ●SCCB 接口
  ●LED 和闪光灯输出控制
  Note1: DSP(镜头校正、去噪声、黑白点补偿、自动白平衡等)配置文档-《OV7670 Software Application Note》*
  像素输出格式:
  VGA,即分辨率为 640480 的输出模式;
  **QVGA,即分辨率为 320240 的输出格式,也就是本手册我们需要用到的格
  式;**
  QQVGA,即分辨率为 160*120 的输出格式;
  数据输出时序
  PCLK,即像素时钟,一个 PCLK 时钟,输出一个像素(或半个像素,高字节+低字节)。
  VSYNC,即帧同步信号。
  HREF /HSYNC,即行同步信号(有效时,数据才被穿走或者写入)
  OV7670 的图像数据输出(通过 D[7:0])就是在 PCLK, VSYNC 和 HREF/
  HSYNC 的控制下进行的(一个高电平开始写数据,再次高电平时写数据完成)。首先看看行输出时序,如图所示:
  
  对外输出时序
  
  因为 OV7670 的像素时钟( PCLK)最高可达 24Mhz,我们用 STM32F103ZET6
  的 IO 口直接抓取,是非常困难的,也十分占耗 CPU(可以通过降低 PCLK 输出
  频率,来实现 IO 口抓取,但是不推荐这样操作)。所以,我们并不是采取直接
  抓取来自 OV7670 的数据,而是通过 FIFO 读取,PZ-OV7670 摄像头模块自带了
  一个 FIFO 芯片,用于暂存图像数据,有了这个芯片,我们就可以很方便的获取
  图像数据了
  对外引脚描述
  
  (1)如何存储图像数据。
  PZ-OV7670 摄像头模块存储图像数据的过程为:等待 OV7670 同步信号→
  FIFO 写指针复位→FIFO 写使能→等待第二个 OV7670 同步信号→FIFO 写禁
  止。通过以上 5 个步骤,我们就完成了 1 帧图像数据的存储。
  (2)如何读取图像数据。
  在存储完一帧图像以后,我们就可以开始读取图像数据了。读取过程为:
  FIFO 读指针复位→给 FIFO 读时钟( FIFO_RCLK)→读取第一个像素高字节→
  给 FIFO 读时钟→读取第一个像素低字节→给 FIFO 读时钟→读取第二个像素
  高字节→循环读取剩余像素→结束。
  方法:中断检测同步帧跳变,第一次跳变:数据可以开始写入FIFO了,第二次跳变,数据写入完成可开始读取
  硬件接口
  
  OV的大量寄存器在文档:《OV7670高级数据手册》
  程序可改进:SCCB通信方式用硬件,或者库函数编写。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分