介绍
遇到的问题
去雾:
软硬件联合开发,使用verilog设计图像处理模块,并利用Xilinx官方提供的IP核实现整个实时系统的图像处理功能搭建。软件设计通过vivado SDK软件开发工具实现对系统采集模块以及DDR缓存配置。OV5640作为系统的图像采集输入,图像帧缓存模块通过DDR3提供暂存空间。图像处理模块基于本文暗通道去雾和引导滤波。显示模块通过HDMI输出去雾图像。
图像采集模块的寄存器配置以及图像帧存储基于PS实现。
去雾和显示模块基于PL。 通过AXI总线实现数据交互。
XIlinx ZYNQ7020 PS端和PL端通过AXI总线进行数据交互。
DDR3 RAM外设。PS端挂载容量为1GB,数据位宽为32位。
以太网接口
USB串口
HDMI输入输出接口
异步处理
资源:
逻辑单元CLB: 85K
查找表LUTs: 53200
触发器FF: 106400
Block RAM: 140
DSP:220
PL端资源占用率: DSP 220 占用了137,占用率63.2%
帧图像缓存
将图像数据缓存到PS端外置大容量DDR3中。三帧图像。
摄像头采集
PS端完成初始化配置,通过SCCB协议配置OV5640寄存器。同时配置VDMA来实现对视频数据的帧缓存。
PL端 去雾算法电路,视频显示模块
PS端主要通过SCCB协议对OV5640进行配置,PS端实现SCCB的驱动。SCCB接口通过EMIO连接至PS端。
根据SCCB的传输方式对寄存器进行以下配置。
1 寄存器的写数据,通过SCCB写入OV5640器件地址,然后写入寄存器地址,最后写入数据。
2 寄存器读取。在配置寄存器的读取时,以此读取OV5640器件地址,相应的寄存器地址,寄存器的具体数据。
在SDK软件中,配置好寄存器便可以完成摄像头的采集工作,开始采集时首先需要等待10帧数据,以便于摄像头数据稳定输出。
MIO:多功能IO接口
EMIO:扩展到MIO。
视频显示模块
视频显示模块通过VDMA的读通道来读出DDR的帧缓存视频数据,将视频数据传输到video-stream to video OUT IP 。视频时钟控制器VTC产生显示器所需的时序信号。在两者配合下,将数据信号利用RGB -2DVI IP转化成HDMI差分信号。
完成显示。
视频显示模块需要PL端来实现。 PL端通过VDMA完成视频数据的读取。
PS端配置动态时钟,VDMA以及VTC视频时钟控制器。
数据传输通路:
为将数据流转化为视频数据,数据流通过AXI-Stream to vid Out IP,该IP核与VTC协同工作。生成视频输出格式的时序信号。VTC用于控制AX-Stream接口和视频输出的时序参数。为时序发生器。用于对显示器输出所需的时序信号。从而无需去考虑行,场消隐区。 HDMI向下兼容DVI。 RGB2DVI 将视频数据以及时序信号转化为HDMI差分信号和输出时钟,徐奥两个不同频率的输入时钟。 VTC和HDMI的时钟信号由动态时钟配置提供。
HDMI: 数据编码 -- 8位 -10位数据转换,并串转换,单端信号变差分信号
开窗
基于3行数据缓存模块,在滤波模块中我们只需要做的是通过移位寄存器获取同一行的三个数。
使用三个fifo作为三行数据的缓存,当第一行数据写入满line_buffer0后将第一行数据读出作为line_buffer1的输入,同时line_buffer0继续写入。 当line_buffer0,line_buffer1,line_buffer2,等三个fifo 写满目的数据后,第四行数据来临时,同时输出三行数据实现并行操作。
当对图像进行开窗操作时,以边界像素为中心的窗口会存在部分像素点缺失,对于边界问题在图像边界外补充合适的常数
可以采用填充固定值的方式,不会影响到开窗的局部区域像素点极值,操作简便。
图像区域分割
天空区域分割,数据经灰度化后通过sobel算子计算,进行二值化。二值化标记位1的像素点为天空区域,对该区域进行平均值计算。
图像分割 --用于计算暗通道
天空区域平均值计算 -- 用于计算大气光值
暗通道模块
首先需要进行sobel图像分割,分割出非天空区域。
暗通道先验理论可以描述为:在绝大多数非天空图像的局部区域,通常存在某些像素至少在一种颜色(RGB)通道中具有非常低的强度值,且趋之于零。
输入图像三个颜色通道取最小值,然后在局部窗口进行最小值滤波得到暗通道图像。
三通道最小值: 通过逐点像素进行三通道最小值的比较,通过两个选择比较器完成。求出单个像素点RGB三个通道的最小值。得到最小值图像。
最小值图像---进行最小值滤波。对图像数据进行行缓存,通过移位寄存器形成图像窗口,将图像窗口最小值进行比较。 行比较器和列比较器,先得到行最小值,再比较三列最小值。
透射率模块
输入为暗通道图像,全局大气光值,天空区域检测输入。
解决的问题:
1 全局大气光值求取限制。将暗通道图像前0.1%的高亮像素点作为全局大气光的依据,在软件处理中通过排序求取大气光值,在硬件电路中FPGA存储资源有限,该方法消耗大量的存储资源且计算时间开销大,难以应用于实时图像的处理。
2 图像滤波开窗尺寸受限。图像数据在FPGA中用完即丢弃,需要对局部窗口进行行缓存。但当最小值滤波以及引导滤波开窗尺寸过大时,将会消耗大量内部资源,且延迟高。因此在图像去雾效果和资源消耗上寻求平衡。
3 透射率时归一化的浮点数,浮点数运算消耗资源大且速度优化受限。
1
图像去雾算法的最小值滤波以及均值滤波需要进行开窗操作。通过行缓存,通过移位寄存器通过打拍截取数据形成局部窗口。
1 均值滤波通过乘加树 来完成窗口像素的处理。 均值滤波用于引导滤波中
2 最小值图像通过比较器实现后,开窗最小值滤波。
2
本文结合天空区域平均像素计算,通过帧迭代来对大气光值进行优化处理。
通过检测天空区域像素点平均值的方法来估计大气光值。
暗通道中最亮的0.1%的像素的均值。
相邻帧差别较小,可将前一帧图像数据处理结果作为当前帧全局大气光值。
3 在设计透射率模块时,采用移位的方式扩大数据倍数,左移10位,扩大1024倍。
最后通过移位复原位数。
引导滤波
激光雷达:
neuvition M系列 700线。百米精度
Jetson Xavier NX
无人打靶距离受限
主要是因为目标检测模型失效,图像特征不够。
部署:yolov5s
-
pt文件 -->wts文件–>tensorrt 等部署平台 --> jetson部署--在linux环境下
-
下载官方的jetpack_v4.4.1
生成wts文件 -- build 生成部署引擎 --缩小宽度和深度来达到剪裁模型,加快运行速度的作用 --通过tensorrt生成了基于C++的engine部署引擎文件 -- 使用python调用
森林火灾:
NVIDIA Jetson TX2
RealSense D435i RGBD深度摄像头
Beitian BN-880GPS模块
ATK1218-BD北斗导航卫星
DS18B20温度传感器
SIM800C GSM
串口2 和串口3 GSM和GPS, GSM需要独立供电
DS18B20 温度传感器 单总线