一、开发遇到的问题
1.画面抖动问题(暂时总结这么多)
- 画面出现大规模抖动可能是因为代码的bug,比如pclk时钟和FPGA时钟不协调,缓存代码有问题等等;
- 如果代码调整了始终有问题,而且画面虽然抖动,但移动摄像头画面依然有明显的轮廓变化,可能就是硬件的问题,比如摄像头和FPGA间的数据线受周围元件磁场干扰(可用锡纸包裹线材),杜邦线质量太差(没办法,换一扎吧)
二、像素颜色模式
彩色图像通常由三种颜色组合生成,最常用的就是红绿蓝(RGB)三色。但是基于成本的考虑,大多数芯片在单像素位置上只会有单一颜色感应器。最普遍使用到的色彩滤波阵列(CFA)为Bayer阵列。Bayer阵列中50%像素为绿色,红色和蓝色各占25%。这主要是因为人眼对绿色最敏感。MT9V034采用的Bayer阵列如图所示
即每个像素点只有RGB中的一种,若要在VGA显示彩色图像中,须将Bayer阵列转化为RGB格式,再将每个像素的RGB数据拆分赋值给VGA显示引脚的VGA_R[ ],VGA_G[ ],VGA_B[ ]。
三、FPGA图像处理方法
图像在采集和传输的过程中,通常会产生噪声,使图像质量降低,影响后续处理。因此须对图像进行一些图像滤波、图像增强等预处理。为改善图像质量,去除噪声通常会对图像进行滤波处理 ,这样既能去除噪声,又能保持图像细节。
1、图像增强
两大方法:空间域方法和时间域方法(以后再详述)
2、图像滤波
(1)平滑空间滤波器
(2)中值滤波算法
3、图像边缘检测
边缘指图像局部强度变化最显著的部分。边缘主要存在与目标与目标、目标与背景、区域与区域(不同色彩)之间,边缘检测是图像分割、纹理特征和形状等图像分析的基础。
4、图像目标提取算法
(1)相邻帧差法
对相邻的两帧图像求差,将图像中的目标位置和形状显示出来,差分后的图像不为零的即为目标。在两帧图像中,灰度值没有变化的部分被剪掉,主要是背景和一些小部分目标。
由检出的部分大致可以确定运动目标的位置,但是该方法的确定是当物体的位移较小时,难以确定目标的运动方向并且在目标的内部产生空洞。
(2)光流法
(3)背景帧差法
此方法选取一副图像作为背景图像,用采集到的图像与背景图像差分,在背景图像选取合适的时候,能比较准确地分割出目标物体。 速度快,易于实现,并能提供完整的运动区域信息。
具体原理图:
如上图,首先将背景图像和当前图像进行差分,得到两幅图像的背景差图像(从存储器中提取出亮度分量得到灰度图像,经过图像的中值滤波等处理后,进入图像检测算法模块;然后只需将两幅图像中对应的像素相减后再取绝对值即可得到背景差图像),采用直方图统计的方法来确定图像的 二值化阈值(阈值一般设定为G分量的平均值),最后对图像进行二值化处理,提取出目标的轮廓。
求背景差 VHDL代码实现:
5、注意点
(1)视频输入设备的采样频率和FPGA的晶振频率通常不一样,因此会产生异步时钟域的问题,因此可以先将采集的图像数据存入到FIFO中,然后再存进SRAM中。
(2)不同时钟域之间会产生亚稳态情况:当信号通过两个时钟域的交界处时,将会分别由两个时钟来控制信号的值,此时如果两时钟信号的敏感延非常接近,将出现数据信号不稳定的情况。
三、图像数据存储
从摄像头采集的数据先进入FIFO缓冲器中,存满一行的数据后,再由SRAM控制器读取到SRAM中。注意:采集的视频图像数据是隔行扫描的,即先传奇数场再传偶数场,为了后续图像处理的方便操作,须将两场数据合并为完整的一帧图像。具体方法:先将奇数场的数据以隔行的方式存在SRAM中,即奇数场的第一行存在SRAM的第一行,第二行存在SRAM的第三行,与第一行相隔一行的地址空间,直到行数据全都发送完毕,然后开始存放偶数场,第一行放在第二行等等。
内部控制器controller根据异步FIFO的满空状态来使能SRAM控制器,当FIFO满状态有效空状态无效时,SRAM开始从FIFO中读取数据。
使用FIFO的目的:避免亚稳态。由于采集频率和FPGA的时钟频率不同,为异步时序电路。且数据经FIFO后时钟信号统一为系统时钟。
异步FIFOzho中包含:写地址产生,读地址产生和一个双口RAM。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82538.html