图像旋转的FPGA实现(一)
继续图像处理专题,这次写的是图像旋转。若要说小分辨率的图像旋转倒也简单,直接将原始图像存储在BRAM中,然后按照旋转后的位置关系取出便是。但是对于高分辨的图像(720P及以上)就必须得用DDR3或者DDR4缓存了,而DDR是突发传输,对连续视频流十分友好。所以在旋转180°时倒也问题不大,但是若旋转90°或者270°的话,每取出一个数据,
就要跨行一次,而DDR跨行传输的效率极低,经测量大概是10%左右,根本无法满足实时性要求。
那么,又该怎么解决旋转90°或者270°DDR传输效率低的问题呢?我查阅了大量资料,有一种方法是改用sram存储图像,这样便没有跨行传输效率低下的问题。但是现在FPGA的开发板普遍带的是DDR,也没有必要为了图像旋转这个功能重新设计电路,增加sram芯片。另一种方法则是改变DDR读写图像的方式,这里也有两种方案。方案1是对DDR进行分块,DDR的一块存储一行有效图像数据,这样就使得DDR跨行次数减少。同时由于DDR位宽大于像素数据位宽,所以每读取一个数据就能获得数个像素点,可供几次旋转90°或者270°使用。
方案2是对图像进行分块,写入DDR时按照分块尺寸对应关系,每一行写入一个分块,这个方法同样会使得旋转操作后读取DDR跨行变少。有些人或许就会疑问,连续的视频流怎么分块呢?视频的确是连续进入的,可是我们可以控制写入的地址,假如分辨率是1920*1080,分块是192*10,那么在DDR写到192-8地址时,就直接跳转到0+DDR列长度处了,进而实现DDR的一块存储原图像的一行数据。
这里的话,我选择的是第一种方案,即DDR的一块存储原图像一行有效数据,并在720P和1080P各种制式下验证通过,具体实现细节见下一篇博客。
事实上,我只实现了直角旋转,即旋转90°,旋转180°,旋转270°。而想实现任意角度旋转的话则思路一致,即重新排列图像写入DDR顺序,使得读DDR跨行操作次数降低,而关于这一点,万方上有一篇名叫“基于FPGA的数字图像旋转引擎设计”(李杰明)的论文,大家有兴趣的可以去查阅观看。
图像旋转的FPGA实现(一)的更多相关文章
- NOI题库 09:图像旋转翻转变换
NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
话说,平凡之处显真格,这一点也没错! 比如,对旋转图像进行双线性插值,很简单吧? 可,对我,折腾了大半天,也没有达到预期效果! 尤其是三个误区让我抓瞎好久: 1,坐标旋转公式. 这东西,要用 ...
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...
- Opencv2.4.4作图像旋转和缩放
关于下面两个主要函数的讲解: cv::getRotationMatrix2D(center, angle, scale); cv::warpAffine(image, rotateImg, rotat ...
- 每日算法37:Rotate Image (图像旋转)
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- [google面试CTCI] 1-6.图像旋转问题
[字符串与数组] Q:Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, wr ...
- pyhton:图像旋转
最近一个作业中要用到图像旋转,分享一下学习过程.如有讲错的地方,恳请指正! 图像旋转,想想真简单啊,不就是将图像矩阵乘上一个旋转平移矩阵就完了吗?实际上还真没这么简单.首先这个旋转平移矩阵怎么获得?通 ...
- CCF CSP 201503-1 图像旋转 (降维)
题目链接:http://118.190.20.162/view.page?gpid=T27 问题描述 试题编号: 201503-1 试题名称: 图像旋转 时间限制: 5.0s 内存限制: 256.0M ...
- 图像旋转、伸缩的自写matlab实现
一.图像的旋转 今天的代码不是自己写的,缺少一些时间.但是认认真真推导了一下旋转的公式,代码的思想与原博博主一致,致敬! 愚以为,自己来实现图像旋转算法的关键点有二:其一,确定旋转后的图像边界.其二, ...
随机推荐
- JAVA面向对象详细总结
面向对象概念 所有操作基于对象进行操作实现 面向对象的三大特征 封装.继承.多态 类:具有相同特征和行为物体的统称 在java中类的定义语法: [修饰符] class 类名{ 属性 ...
- Unreal如何进行材质优化?
Hello,大家好,今天给大家带来实用的材质优化,我是木偶心没.优化在每个游戏项目里面都会涉及到,是一种为了达成相同目标,寻求并采用消耗更少资源的办法.一般会在CPU,GPU,网络和内存方便进行优化. ...
- VisualCom软件仿真平台V1.0发布(附安装包下载链接)
自我们借助VisualCom(暂定名称,后续可能会变更)软件平台撰写技术文章以来,有不少粉丝发私信询问该软件哪里来的,以及哪里有安装包,这里回复一下:VisualCom软件平台是由本微信公众号组织开发 ...
- 喜鹊开发者(The Magpie Developer)
搬运文,原文地址:https://div.io/topic/1576 我经常感觉,开发人员很像我们所说的喜鹊,以不停的获取很多小玩意来装饰他们的窝而著称.就像喜鹊一样,开发人员通常都被定义为聪明的.好 ...
- hdu5438 拓扑排序+DFS
解析 对一个有向无环图(Directed Acyclic Graph,简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则 ...
- 深入理解Linux文件系统与日志分析
一.inode和bolck概述 二.链接文件 三.inode节点耗尽故障处理 四.EXT类型文件恢复 五.xfs文件备份和恢复 六.日志文件 一.inode和bolck概述 1.定义 文件数据 文件数 ...
- 如何快速实现一个虚拟 DOM 系统
虚拟 DOM 是目前主流前端框架的技术核心之一,本文阐述如何实现一个简单的虚拟 DOM 系统. 为什么需要虚拟 DOM? 虚拟 DOM 就是一棵由虚拟节点组成的树,这棵树展现了真实 DOM 的结构.这 ...
- Java:Java中equlas和==的区别
== 比较的是栈内存的地址值,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 基本数据类型如:byte,short,char,int,long,float,do ...
- bugKu变量1
重点:两个$$,这暗示着第二个$变量的值,作为第一个$的名称. 而且代码审计之后,发现只含有字母. 又暗示在变量中,那么猜想是在全局变量中,而php中全局变量是$GLOBALS.
- 《PHP设计模式大全》系列分享专栏
<PHP设计模式大全>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第 ...