热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

对于高速视频图像中的物体轮廓提取中,图像的二值化,采用软件方式,速度无法满足需要,因此要采用FPGA方案,这样

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

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

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

 

 

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

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

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

 

二、FPGA结构原理图如下:

说明:

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

 

四、运行结果照片和视频

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

     1. 照片

     

   2.演示视频&#xff08;录像时用手机录的&#xff0c;不是很清楚&#xff0c;请大家包涵了&#xff09;

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

      机器视觉产品 

 

 


转载于:https://www.cnblogs.com/dongchunxiao/archive/2012/09/01/2666270.html


推荐阅读
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • GSIOpenSSH PAM_USER 安全绕过漏洞
    漏洞名称:GSI-OpenSSHPAM_USER安全绕过漏洞CNNVD编号:CNNVD-201304-097发布时间:2013-04-09 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
author-avatar
寒风中挣扎_427
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有