FPGA相机边缘检测

使用MiniZed ZYNQ FPGA SoC实现用于车道检测的实时边缘检测算法。

这个项目中使用的东西

硬件组件:Avnet迷你Zed、ov7670、母头8位置1行(0.1英寸)
软件应用程序:AMD Vivado设计套件、AMD Vivado设计套件HLx版本
手工工具和制造机器:烙铁(通用)

该项目将展示如何实现完整的端到端图像处理管道,以实现能够以30fps运行的边缘检测视觉算法,以检测道路车道。

1.介绍

为了实现实时车道检测,这个想法是将图像通过边缘探测器IP。最著名的是Sobel边缘探测器。然而,Canny边缘探测器的优点是它具有可编程的阈值。即时修改阈值可以适应不同的照明条件。

视觉处理管道可以逻辑上分为三个部分。图像源、图像处理管道和图像汇。

FPGA相机边缘检测 - 第4张

从高级的角度来看,人们需要一个可以是相机传感器或图像图案生成器的图像源和可以作为显示器的水槽。

2.硬件块

首先,所有原型硬件部件必须放在一起。在这种情况下,系统硬件仅由五个组件组成。

A)MiniZed ZYNQ开发板

b)OV7670相机

C)Arduino屏蔽perfboard

D)10针0.1英寸母头

e)VGA PMOD

OV7670相机安装在10针母头0.1英寸接头上,该接头本身被焊接到原型板上。VGA PMOD连接到MiniZed双PMOD接头。最后一步是将VGA电缆连接到显示器。

FPGA相机边缘检测 - 第5张

一旦硬件系统组装在一起,下一步就是使用Vivado在FPGA(PL)上设计硬件。

3.FPGA硬件

1.图像来源

有许多相机接口,但最简单的是使用并行总线的CMOS传感器,如著名的OV7670相机传感器。然而,要使用这样的传感器,必须实现一个相机捕获模块,该模块将从传感器传输的字节流转换为适当的协议,在我们的案例中是AXIS总线。

此外,相机必须通过在PL中实现配置模块作为从BRAM读取配置的I2C模块或在PS中作为通用相机驱动程序来配置。PS配置显然更灵活,所以我选择了这个选项。

FPGA相机边缘检测 - 第6张

Vivado设计的图像源是与OV7690 CMOS相机接口的自定义IP。相机使用并行八位接口。此外,有两个同步信号HSYNC和VSYNC,其频闪模式表示行和帧。相机使用输出像素时钟PCLK。像素率与PCLK同步。OV7690相机还需要24 MHz(XCLK)相机时钟作为输入。

OV7690每像素输出2字节。根据配置代码,相机可以配置为使用不同的色彩空间。IP 配置为使用 RGB565 色彩空间。相机的控制是通过AXI接口完成的。相机IP在内存中被分配了一个位置。要启动相机,必须设置位才能启用相机输出数据。数据本身使用AXIS(AXI Stream)协议进行打包。

2.交叉时钟域

相机的AXIS输出被发送到异步FIFO。这是每当需要跨越两个不同的时钟域时使用的方法之一。

FIFO的从站连接到PCLK,而FIFO的主站连接到以50MHz运行的AXI主时钟域。主时钟必须始终高于从站时钟,否则FIFO将溢出,导致丢失像素。

FPGA相机边缘检测 - 第7张

像素流穿过时钟域后,它通过子集转换器发送。这是一个AXIS IP块,将RGB565数据重新映射到24位数据包。图像处理IP使用24位,因为每种颜色都分配了8位。

下一个元素是AXIS开关。此IP作为AXIS流的简单多路复用器运行。它可以通过AXI lite接口或利用AXIS频闪信号自动配置。在这个特定的应用程序中,AXIS Switch的AXI Lite接口被启用。然而,这需要实现SDK驱动程序来配置交换机mutliplexer。

3.图像过滤

Canny边缘探测器IP是使用Vivado HLS构建的。它用C编码。HLS的主要优势是允许快速部署IP。缺点是生成的逻辑被混淆了,通常不如手工制作的Verilog代码高效,尽管它可以接近它。无论如何,生成Cunny IP涉及使用Vivado HLS 2013和使用xfopencv的2018.3版本。这是一组C++库,用于复制FPGA逻辑的众所周知的OpenCV库。

Xilinx最近发布了Vivado 2019.1和HLS 2019.1。这需要将SDSOC与非免费的修订框架一起使用。

实施的修订代码的主要变化是修改功能,以支持AXIS协议进行输入和输出。此外,AXI Lite总线用于将集合中的所有可编程变量捆绑在一起,并通过连接到GP0 ZYNQ总线的AXI互连将它们暴露在PS内存映射中。

FPGA相机边缘检测 - 第8张

最后,为了在两个不同的IP之间切换,使用了AXI交换机。正如所说,这个IP基本上可以用作可编程的多路复用器或去多路复用器。IP允许将原始图像帧像素路由到Canny边缘检测器、RGB到灰度检测器或包含co图像处理IP的直通通道。

4.VDMA

Canny edge探测器的输出是24位像素流,因此它被发送到另一个子集转换器,该转换器将像素转换为16位。然后将像素传输到VDMA IP。VDMA在读取和写入模式下都配置了。VDMA的目的是在DRAM的连续区域写入像素流,以便PS可以访问图像。然后将像素流读取并写入到AXIS视频。

FPGA相机边缘检测 - 第9张

VDMA配置为三重缓冲模式。VDMA需要在操作前通过将VDMA连接到主AXI互连的AXI lite接口进行配置。

下面的代码显示了VGA分辨率的VDMA配置。

  1. Xil_DCacheFlush();
  2. Xil_ICacheInvalidate();
  3. /* Start of VDMA Configuration */
  4. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0x30, 0x8B);
  5. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0xAC, 0x10000000);
  6. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0xB0, 0x100F0000);
  7. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0xB4, 0x101E0000);
  8. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0xA8, WIDTH*2);
  9. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0xA4, WIDTH*2);
  10. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0xA0, HEIGHT);
  11. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0x00, 0x8B);
  12. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0x5C, 0x10000000);
  13. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0x60, 0x100F0000);
  14. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0x64, 0x101E0000);
  15. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0x58, WIDTH*2);
  16. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0x54, WIDTH*2);
  17. Xil_Out32(XPAR_VDMA_S2MM_BASEADDR + 0x50, HEIGHT);

VDMA的输出通过高性能接口HP0发送到DDR3 RAM,而VDMA MM2S接口则发送到视频接收器块。

5.视频接收器(VGA接口)

MiniZed使用外部VGA分路板。视频AXIS与外部VGA外围设备接口IP接口。此IP从VDMA获取视频数据,从VTC(视频定时控制器)获取定时信息。

VTC本身配置为VGA分辨率。

FPGA相机边缘检测 - 第10张

这基本上是一个R2RDAC,它将数字数据总线与行和帧同步信号HSYNCS和VSYNC一起,并将数据发送到显示器。

如下图所示,应用程序在正常VGA模式、灰色模式(看起来更像蓝色)和边缘检测模式之间持续切换。

正常、灰度和边缘检测过滤器。

摘要

该项目展示了如何在ZYNQ FPGA SoC上实现完整的端到端视觉处理管道。该硬件能够以30 fps的速度进行实时边缘检测。

其他想法包括:

  • 添加更多过滤器类型,如中位数、Guassian、Sobel、Prewit等。
  • 为MiniZed构建一个PYNQ发行版,从Linux访问IP,以便构建无线WiFi摄像头
  • 升级到更高清晰度的相机传感器。

原理图:ZYNQ Canny边缘检测原理图

本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/8709.html

"愿我的文字能带给您一丝美好"

还没有人赞赏,支持一下

评论

A 为本文作者,G 为游客总数:0
加载中…

提交评论

游客,您好,欢迎参与讨论。

我的购物车

购物车为空

优惠券

没有优惠券