用FPGA实现视频中物体边缘二值化

摘要:
对于高速视频图像中的物体轮廓提取,图像二值化的速度不能满足软件的要求。因此,应该使用FPGA来实现相同的二值化速度和帧速率,这可以与视频完全同步。1、 算法原理:边缘二值化有很多算法,如sobel方法、roberts方法、laplace方法和导数方法。为了简单起见,使用了导数法。视频图像每帧的扫描顺序如下图中的黑色箭头所示。为了确保二值化和视频同步,需要扫描视频的每帧

       对于高速视频图像中的物体轮廓提取中,图像的二值化,采用软件方式,速度无法满足需要,因此要采用FPGA方案,这样可以实现二值化速度和帧率一样,完全和视频同步。

一、算法原理:  边缘二值化的算法很多,象sobel法,roberts法,拉普拉斯法,导数法。为了简单化,采用导数法。

       视频图像每帧扫描顺序如下图的黑色箭头所示  

用FPGA实现视频中物体边缘二值化第1张

     为了保证二值化和视频同步,必须要求视频每扫描一个点,就立刻进行二值化处理,也就是说每个像素点时钟进行一次。每个点(如上图红色点)进行锐化求导只能和已经出现过的相邻点(如图上图绿色4个点)进行,当前点的锐化导数值subv为:

              subv=max(|v-v10|,|v-v00|,|v-v01|,|v-v02|) ,即和相邻点差值绝对值最大一个作为其锐化值

      当subv大于规定的值时,标记该点是1,否则是0,实现图像二值化。

二、FPGA结构原理图如下:

用FPGA实现视频中物体边缘二值化第2张

说明:

     1. CMOS摄像头连接camera接口上,该接口模块提取视频数据分成2路:1)保存到双口RAM1中,以便下一行点锐化用。2)和上一行里的4个数据进行比  较,得到锐化的二值化数据存放到双口ram2中。

     2. CMOS摄像头同时连接S3c2440(三星arm,带camera接口)    

     3 。数据读取模块根据TFT时序发生器送来的控制,选取RAM2或者S3c2440送来的视频数据。通过TFT时序发生器将两个视频数据合并同时显示在屏幕上。这种结构主要目的是把原始图像和处理后的图像同时显示,以便对比调试。

三、verilog HDL 代码:

// 定义了一个双口ram存放可存放640*480个二值化像素点

 RAM2PORT cambuf_ram(sharp_caminv,sharp_camreadAdr,ARM_DCLK,sharp_camadr,LVDS_PCLK,1,sharp_camoutv);
//////////////////////////////////////////////////////////////////////
always @( negedge LVDS_PCLK) //相机时钟下降沿,(这里的LVDS把相机所有信号传来)
begin
        if (LVDS_VS==0)   //相机的帧时钟=0
                begin
                          cam_pcnt=0;//每行点计数器清
                          cam_hcnt=0; //每帧行计数器清

                end
        else
                begin
                        if (LVDS_HS==0)  //相机的行时钟
                                begin
                                        cam_pcnt=0;  //每行点有效点计数器清空
                                        hs1=0;
                               end
                        else
                                begin
                                        if (hs1==0)
                                        begin
                                                hs1=1;
                                                cam_hcnt=cam_hcnt+1; //每帧行计数器加
                                        end
                                      cam_pcnt=cam_pcnt+1;
                                      if ((cam_pcnt<1280)&&(cam_hcnt<480)) //注意每行有效点1280,不是640,因为YUV格式,每个点需要传送两个时钟
                                                begin
                                                        camadr=cam_pcnt[15:1; 
                                                        sharp_camadr=cam_hcnt*640+camadr; //二值化双口RAM地址
                                                        
                                                        if(cam_pcnt%2==1)
                                                         begin
                                                               camLastV10<= camLastV11;  //获取对应邻近点值V10
                                                               camLastV11<=LVDS_D;        //当前点值v11是当前点
                                                               
                                                               camLastV00<= camLastV01;//获取对应邻近点值V00
                                                               camLastV01<= camLastV02;////获取对应邻近点值V01
                                                                camLastV02<=camLastV11buf[camadr+1]; //获取对应邻近点值V02,注意V02是从上一行的RAM
                                                               camLastV11buf[camadr]<=LVDS_D;//保存当前点到上一行中
                                                               
                                                               //以下是和相邻的4个点进行比较,最大差值作为锐化导数值
                                                              subv1=camLastV00>camLastV11?camLastV00-camLastV11:camLastV11-camLastV00;
                                                              subv2=camLastV10>camLastV11?camLastV10-camLastV11:camLastV11-camLastV10;
                                                              subv3=camLastV01>camLastV11?camLastV01-camLastV11:camLastV11-camLastV01;
                                                              subv4=camLastV02>camLastV11?camLastV02-camLastV11:camLastV11-camLastV02;
                                                              subv=subv1>subv2?subv1:subv2;
                                                              subv=subv>subv3?subv:subv3;
                                                              subv=subv>subv4?subv:subv4;
                                                              sharp_caminv= (subv>sharpv0)?1:0; //二值化,结果保存到双口ram中
                                                             
                                                         end
                                                end
                                end
                end
end

四、运行结果照片和视频

      该FPGA软件方案在北京数磊的IEC03工业智能相机运行结果如下:

     1. 照片

     用FPGA实现视频中物体边缘二值化第3张

   2.演示视频(录像时用手机录的,不是很清楚,请大家包涵了)

     http://v.youku.com/v_show/id_XNDQ1ODg1ODUy.html

      机器视觉产品 

免责声明:文章转载自《用FPGA实现视频中物体边缘二值化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Linux C中文函数手册】之 目录操作函数VUE+elementUI表格多选框实现单选以及数据回显时toggleRowSelection失效问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【资料】2021年最网红的FPGA开发板之一——DE10-Nano (SOC FPGA入门推荐!)

DE10-Nano开发板可谓2021年最网红的FPGA开发板之一,除了广泛用于物联网,边缘计算,硬件加速,AI 和 EDA教育课程外,还有不少发烧友将其用于网络上日渐风靡的开源复古游戏项目——Mister。可谓是跨越了学术界,工业界,科研界,无所不及。 友晶科技对板子提供的技术支持也是十分给力,不仅24小时官方邮件答复, 论坛值守,还不断不断的开发出配套...

Halcon一维测量1D Measuring解析

一维测量(也叫一维计量或卡尺)的概念非常直观。沿着一个预定的区域(主要是垂直于RIO感兴趣区域的方向) 边缘的位置。这里的边缘为从暗到亮或从亮到暗的过渡。基于提取的边缘,可以测量零件的尺寸。例如,可以测量 ROI内零件的宽度,并将边缘定位在其左右两侧。 除了这些简单的矩形ROI外,圆弧也可以用来测量,例如,齿轮上的齿轮宽度。这种测量方法的优点是使用方便,执...

FPGA 移交代码学习——Map错误 ODDR2 使用问题

这段时间一直忙贴片生产相关事情,又是搬家,都没有什么时间好好整整。 前人移交过来的记录仪代码,发现一个BUG , 1 wire [8:0] fchk_shift_r1 = fenergy_chk<<1; 2 wire [9:0] fchk_shift_r2 = fenergy_chk<<2; 3 wire [10:0]fchk_sh...

Halcon学习之边缘检测函数

sobel_amp( Image: EdgeAmplitude: FilterType, Size:)根据图像的一次导数计算图像的边缘 close_edges( Edges, EdgeImage: RegionResult: MinAmplitude:) close_edges_length( Edges, Gradient: ClosedEdges: M...

深入理解CPU和异构计算芯片GPU/FPGA/ASIC (上篇)

随着互联网用户的快速增长,数据体量的急剧膨胀,数据中心对计算的需求也在迅猛上涨。诸如深度学习在线预测、直播中的视频转码、图片压缩解压缩以及HTTPS加密等各类应用对计算的需求已远远超出了传统CPU处理器的能力所及。摩尔定律失效的今天,关注“新“成员(GPUFPGAASIC)为数据中心带来的体系架构变革,为业务配上一台动力十足的发动机。 1 异构计算:WHY...

FPGA综合工具--Synplify Pro的常用选项及命令

最近要用到Synplify,但以前没使用过,无基础,找到一篇帖子,隧保存下来。 本文转自:http://blog.sina.com.cn/s/blog_65fe490d0100v8ax.html Synplify 使用过程中最常用的选项及命令的介绍。一、 状态机相关(1)FSM Compiler Option  FSM Compiler是一个全局选项。勾选...