高云FPGA----图像融合
一 功能描述
利用高云Gowin的18k开发板实现双目摄像头输入,融和算法计算后,HDMI输出。整体实现的重点在于图像融合算法的选取和实现,目前比较好的算法当属SIFT算法,但是该算法的实现对于自己有着比较大的困难,暂时只是简单的进行一个取均值的融和算法。
二 器件型号
- 开发板:Gowin18-PGl84-C8/I7;
- ov5640: 高云的5640双目摄像头,(实测兼容正点原子的双目摄像头) ;
三 模块划分
主要分为四大块
- OV5640的IIC寄存器配置与8_16bit的位宽转换;
- 图像融合算法;
- Video_Frame_Buffe IP核三帧图像缓存与DDR3 IP核的连接;
- DVI_TX IP核的HDMI输出;
其实整个设计需要自己动手写的主要就是图像算法模块,其他大多是各个IP核的例化与使用,所以对于阅读官方文档的能力要求比较高。
3.1 OV5640的IIC寄存器配置
说实话我一开始在有黑金和正点原子的双目摄像头的情况下还去买了高云的双目摄像头的初衷就是想看看他有没有官方的寄存器配置的教程,结果官方的教程设置出来,摄像头显示一直是发红,后来果断放弃,这里建议直接用摄像头对应的例程一般都会例程。像正点原子和黑金都有双目摄像头显示的例程这里可以直接拿过来用。
黑金的寄存器配置输出有两种格式可以选择一个640480分辨率的,另一个是1024768分辨率,这个输出的分辨率主要是通过IIC对于OV5640的寄存器进行配置然后输出的。暂时选择的是640*480@60HZ的分辨率。
寄存器配置完成后输出的RGB565的数据,但是依次输出是只有8bit为了方便后续处理,利用一个位拼接的模块cmos_8_16bit实现位宽的转换。
3.2 图像融合模块
像素级图像融合一种很直接的方法就是对像素点直接加权平均,通常根据不同像素的活跃度来确定权重。例如支持向量机和神经网络的方法都是将活跃度最高的像素点作为融合目标,而小波变换系数则是将这类像素作为特征。
其实这方面一开始打算参考link这个Github上的项目来做的,源码例程都是现成的SIFT算法,但是由于手头的板子是18K逻辑资源可能不太够,比赛结束后就参考了link甘佬的cmos_add模块,其中就是一个像素的加权平均计算。
大体的思路就是首先显示分上下两块,上半部分分别是左右摄像头的显示,下半部分是融合后图像的显示。
3.2.1 上半部分的同步显示
一共有两个问题:一是左右两个摄像头显示的同步问题,二是怎么样让一整行的像素分为左右两个部分。
第一个问题的解决方法:左边摄像头正常的输出,右边的摄像输出的数据我们用一个同步FIFO来进行缓存,这个FIFO的读有效信号我们用左边摄像头信号的行有效信号取反(~cmos1_href),写有效信号是右边摄像头自己的行有效信号(cmos0_herf),同时上电的情况下,这样就有效的保证了左右两个摄像头的行是对齐的,不会出现画面的上下错位或者是其他的情况。行像素的切换标志就是cmos1_href,当cmos1_href有效时整体的像素值pixel_data就是cmos1_data,否则就是cmos0_data。
3.2.2 下半部分的融和显示
图像融合算法就是简单地加权平均:
fusion_data[4:0] = (cmos1_data[4:0] >> 1) + (cmos0_data_splicing[4:0] >> 1);
fusion_data[10:5] = (cmos1_data[

本文详细介绍了利用高云Gowin FPGA开发板和OV5640双目摄像头,实现图像融合及HDMI输出的过程。重点讨论了图像融合算法,采用简单的取均值方法,并详细阐述了OV5640的IIC寄存器配置、图像融合模块的搭建,包括同步显示、融合显示和屏幕切换的实现。此外,还提到了Video_Frame_Buffe和DVI_TX IP核的使用,以及DDR3内存的连接。
最低0.47元/天 解锁文章
479





