基于Vivado HLS在zedboard中的Sobel滤波算法实现

平台:zedboard  + Webcam

工具:g++4.6  + VIVADO HLS  + XILINX EDK + XILINX SDK

系统:ubuntu12.04

总体设计思路

sobel 算法理论基础

      索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:

Gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1)

+(-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)

+(-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)

= [f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)]-[f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1)]

Gy =1* f(x-1, y-1) + 2*f(x,y-1)+ 1*f(x+1,y-1)

+0*f(x-1,y) 0*f(x,y) + 0*f(x+1,y)

+(-1)*f(x-1,y+1) + (-2)*f(x,y+1) + (-1)*f(x+1, y+1)

= [f(x-1,y-1) + 2f(x,y-1) + f(x+1,y-1)]-[f(x-1, y+1) + 2*f(x,y+1)+f(x+1,y+1)]

其中f(a,b),表示图像(a,b)点的灰度值;

图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:

通常,为了提高效率
使用不开平方的近似值:

如果梯度G大于某一阀值则认为该点(x,y)为边缘点。

然后可用以下公式计算梯度方向:

Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。

  

流程

HLS算法验证与实现

算法验证包括算法C/C++实现,综合编译仿真,实现导出pcore用于------->XLINX EDK

EDK硬件   工程搭建

EDK中主要搭建zedboard硬件平台,实现VDMA(用AXI-Stream),HDMI,DDR等等,生成system.bit,用于连同uboot、fsbl生成zedboard bootload (BOOT.BIN)。

参考:

zedboard启动过程分析 :http://blog.csdn.net/xiabodan/article/details/23093111

          zedboard 构建嵌入式linux  : http://blog.csdn.net/xiabodan/article/details/23379645

LINUX       系统移植

准备一张>8G的SD卡,分区为FAT32+EXT4(其中EXT4为文件系统>4GB,FAT分区为内核 设备树 bootloader) 可以采用gparted分区工具完成,apt-get install gparted

系统移植包括内核镜像的编译,bootloader的移植,设备树的编译,文件系统的移植

具体移植步骤参见:http://blog.csdn.net/xiabodan/article/details/23379645

内核镜像地址:git clone http://github.com/Digilent/linux-3.3.digilent.git

uboot源码      :git clone git://git.xiinx.com/u-boot-xarm.git点击打开链接 点击打开链接 点击打开链接

设备树在内核中可以找到,将设备树,内核镜像,BOOT.BIN拷贝到SD卡中FAT分区中

文件系统:http://releases.linaro.org/images/12.04    直接拷贝到SD卡中EXT4分区中

LINUX VDMA驱动应用程序编写与实现

编写驱动程序是为了我们能在PS中对VDMA进行管理和控制。前提是在底层中我们已经做好了所有相关的硬件设计等等。

移植OPENCV库:用于对比FPGA算法处理速度比较,有两种方法移植OPENCV库,

1:apt-get install libopencv-dev  python-opencv(用于python中)

2:下载源码编译

源码地址:http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/

编译步骤参考:基于opencv网络摄像头在ubuntu下的视频获取http://blog.csdn.net/xiabodan/article/details/38875875

结果展示

FPGA硬件实现Sobel效果                                                        OPENCV软件实现Sobel

处理时间显示

结果分析

上图处理时间中 640*480的视频

1:opencv处理一帧的时间0.148554s  大约为7帧每秒

2:fpga硬件实现一帧总时间(算法时间+VDMA拷贝时间)

3:fpga硬件实现一帧的算法时间,不包含拷贝DMA时间

在cortex A9 700MHZ 速度中 ,FPGA实现的算法速度比OPENCV软件实现速度快50-100倍,FPGA一秒钟可以处理500帧图像,OPENCV只能处理10张不到

但是缺点是,视频拷贝花费了太多的时间。所以我个人认为FPGA处理图像不在算法实现有多复杂与困难,因为FPGA的并行率理论上是无穷的,但是视频流的输入输出的速度直接决定了处理速度。暂时没想到好的方法解决。

参考

使用HLS各种问题 :   http://blog.csdn.net/xiabodan/article/details/38448589

Sobel Filter Application on the Xilinx Zynq Zedboard : http://shakithweblog.blogspot.com/2012/12/getting-sobel-filter-application.html

Sobel边缘检测算法http://www.cnblogs.com/lancidie/archive/2011/07/17/2108885.html



基于Vivado HLS在zedboard中的Sobel滤波算法实现的更多相关文章

  1. 推荐系统中的协同滤波算法___使用SVD

    对于推荐方法,基于内容 和 基于协同过滤 是目前的主流推荐算法,很多电子商务网站的推荐系统都是基于这两种算法的. 协同过滤 是一种基于相似性来进行推荐的算法,主要分为 基于用户的协同过滤算法 和 基于 ...

  2. ZED-Board从入门到精通系列(八)——Vivado HLS实现FIR滤波器

    http://www.tuicool.com/articles/eQ7nEn 最终到了HLS部分.HLS是High Level Synthesis的缩写,是一种能够将高级程序设计语言C,C++.Sys ...

  3. 设计简单算法体验Vivado HLS的使用

    前言 本文主要讲解了使用Vivado HLS设计简单C语言的二选一选择器算法的硬件HLS开发的全流程,包括工程创建-算法验证和仿真-算法综合-RTL仿真-IP封装等步骤. 参考网站: http://b ...

  4. Vivado HLS与System Generator:联系与区别

    在很多年以前的ISE套件里面,有个功能强大的AccelDSP,它可以可自动地进行浮点到定点转换,并把算法生成可综合的HDL,还可以创建用于验证的测试平台,但是在4年前左右的时候销声匿迹了,当时的说法是 ...

  5. 基于Vivado的嵌入式开发 ——PS+PL实践

    基于Vivado的嵌入式开发 ——PS走起 硬件平台:ZedBoard 开发工具:Vivado 2014.2 1.规划 废话不多说,依然是流水灯,这次是采用PS+PL实现. 功能依旧简单,目标是为了学 ...

  6. zedboard zynq 学习 sobel 边缘检测 IP核 制作 根据 文档 Xapp890

    官方文档http://www.xilinx.com/support/documentation/application_notes/xapp890-zynq-sobel-vivado-hls.pdf ...

  7. Vivado HLS初识---阅读《vivado design suite tutorial-high-level synthesis》

    Vivado HLS初识---阅读<vivado design suite tutorial-high-level synthesis> 1.启动 2.创建工程 3.添加源文件 4.添加测 ...

  8. 基于FPGA的中值滤波算法实现

    在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑 ...

  9. vivado hls(1)

    笔记 1.vivado  hls是fpga高级综合工具,可以将C语言转换成verilog代码,适合编写算法,但是要有硬件思想. 2.软核就是只要资源足够,就可以用逻辑打一个CPU出来,与硬核不一样,硬 ...

随机推荐

  1. PyDev-Python的Eclipse插件安装

    PyDev官网:http://marketplace.eclipse.org/node/114 安装方法: 1,打开Eclipse,如果是初次使用,关闭欢迎页面,否则无法按照我说的方法安装. 2,打开 ...

  2. Salted Password Hashing

    Here are some examples of poor wacky hash functions I've seen suggested in forums on the internet. m ...

  3. 开发工具及服务年度大奖评选 I Bugtags 荣获最具成长潜力奖

    作为全球最大中文 IT 社区和服务平台.中国最大技术管理者平台的 CSDN 在中国北京总部举办了一场 2015 年开发工具及服务年度大奖评选活动,此次活动目的在于推动开发服务及工具质量的提升,提高行业 ...

  4. Failed to create the java virtual machine完全解决办法

    一直用EcliPSe开发java,突然有这么一天,无法启动了,splash窗口显示“Failed to create the Java Virtual Machine”,结果发现eclipse和mye ...

  5. 关于DevExpress的GridView.VisibleIndex的赋值问题

    在DevExpress GridControl中,GridView中 如果VisibleIndex=-1,则这列将不会显示(不可见): 如果VisibleIndex>=0,则按照VisibleI ...

  6. .NET 添加/删除Cookie

    public class CookieHelper { /// <summary> /// 清除指定Cookie /// </summary> /// <param na ...

  7. JAVA继承时this和super关键字

    JAVA继承时this和super关键字 本文主要讨论在方法前使用this或super关键字时,编译器在什么地方查找对应的函数. 在子类中指定this关键字.首先在本类中查找,如果本类中找不到,再在父 ...

  8. div的contenteditable和placeholder蹦出的火花

    今天在做手机端发布描述内容时,需要实现换行,还需要有plachholder. 在文本框中换行自然想到了textarea. 问题似乎已经解决了,但是当内容发布后,在html中显示换行都丢失了. 这个时候 ...

  9. C#局域网聊天工具_UDP广播

    接上一讲,程序启动就要发送广播消息,如何发送广播消息,这一讲将给大家好好讲讲网络广播的知识,以及C#如何实现广播. 第一部分.什么是广播地址,以及广播地址怎么计算 1.1 广播地址是什么? 主机号全为 ...

  10. 删除sqlserver2008日记文件

    use master go alter database dbname set recovery simple with no_wait go alter database dbname set re ...