图像旋转的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实现
一.图像的旋转 今天的代码不是自己写的,缺少一些时间.但是认认真真推导了一下旋转的公式,代码的思想与原博博主一致,致敬! 愚以为,自己来实现图像旋转算法的关键点有二:其一,确定旋转后的图像边界.其二, ...
随机推荐
- P1045 [NOIP2003 普及组] 麦森数
题目描述 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P−1不一定也是素数. 到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377, ...
- 三、部署被监控主机-Zabbix Agent
三.部署被监控主机-Zabbix Agent 1) 源码安装Zabbix agent软件 在2.100和2.200做相同操作(以zabbixclient web1为例). [root@zabbixcl ...
- Python跨域问题解决集合
Flask 安装插件 pip install flask-cors 使用 CORS函数配置全局路由 from flask_cors import * app = Flask(__name__) COR ...
- 5000字长文,kurryluo 的自学编程之路
我是程序员.大众口中非科班的那种,带着高中时期对二进制的恐惧,在大学参加科研比赛后保研,再到和校友一起创业,现在在某大型互联网公司做前端开发,一路走来都是靠自己学习. 前端框架 VUE 的作者尤大说过 ...
- 你能说出多线程中sleep、yield、join的用法及sleep与wait区别?
Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...
- 『无为则无心』Python基础 — 13、Python流程控制语句(条件语句)
目录 1.流程控制基本概念 2.选择结构(条件语句) (1)条件语句概念 (2)if语句语法 (3)if...else...语句 (4)多重判断 (5)if语句嵌套 3.应用:猜拳游戏 4.三元运算符 ...
- Ubuntu安装部署Kafka
Ubuntu安装部署Kafka 环境: Ubuntu 18.04.4 LTS ,JDK1.8,kafka_2.12-2.3.1 确保已经安装了JDK,JDK安装过程不再赘述.可参考文章xxxx 一.下 ...
- CAS你知道吗?底层如何实现?ABA问题又是什么?关于这些你知道答案吗
CAS你知道吗?如何实现? 1. compareAndSet 在volatile当中我们提到,volatile不能保证原子语义,所以当用到变量自增时,如果用到synchronized会太"重 ...
- 移动端touch、click、tap的区别
一.click 与tap比较 click与tap都会出发点击事件,但是在手机web端,click会有200-300ms延迟,所以一般用tap(轻击)代替click作为点击事件.singleTap 和 ...
- 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法
"为什么这个功能用不了?" 程序员:"清一下缓存" 上篇洞悉系列文章给大家详细介绍了MySQL的存储内幕:洞悉MySQL底层架构:游走在缓冲与磁盘之间.既然聊过 ...