图像旋转的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实现
一.图像的旋转 今天的代码不是自己写的,缺少一些时间.但是认认真真推导了一下旋转的公式,代码的思想与原博博主一致,致敬! 愚以为,自己来实现图像旋转算法的关键点有二:其一,确定旋转后的图像边界.其二, ...
随机推荐
- leetcode:在 D 天内送达包裹的能力
链接:https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/ 我是按照这个思路来做的. 如果随便给一个船的运 ...
- 怎么回答面试官:你对Spring的理解?
最近看了点Spring的源码,正好来稍微扯一扯,帮一部分培训班的朋友撕开一道口子,透透气.我自己都是看的培训班视频,所以也算培训班出身吧.所以下文开口闭口"培训班",不要觉得是我在 ...
- 判断Linux 系统负荷是否过载
1.如果你的电脑很慢,可以查看下它的工作量是否太大. 在Linux系统中,我们一般使用uptime,或者w 或者top命令 如下:在操作系统中输入 :uptime 08:55:44 up 23 day ...
- (Vue中)cehart在同一个dom上画图图切换时饼图有折线图的坐标系
网上都是别人转载的,下面是转载的代码,在Vue中根本不适用 var echartrunningstate = null; if (echartrunningstate && echar ...
- 使用远程Docker进行集成测试
目录 需求背景 使用docker进行环境搭建 以中心化的docker server改进集成测试 Docker Server远程链接配置 Testcontainers 框架 Testcontainers ...
- 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)
l STM32通过PWM与定时器方式控制无源蜂鸣器鸣响 l STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换 l 编程使用STM32 HAL库 l IIC OLED界面编程,动画实 ...
- .net core 支付宝,微信支付 一
源码: https://github.com/aspros-luo/Qwerty.Payment/tree/develop 支付宝支付:参考支付宝sdk及文档,https://docs.open.al ...
- 配置本地yum源以及挂载镜像
配置本地yum源以及挂载镜像(centos7.6) 配置yum源 # cd /etc/yum.repos.d 可以备份或者删除里面的文件 新建文件 # touch /etc/yum.repos.d/l ...
- 4、oracle表操作
4.1.dml操作: 1.查看当前用户下所有的表: select * from user_tables; 2.查看某表的大小: select sum(bytes)/(1024*1024) as &qu ...
- C# 获取电脑Mac地址
private string getMAC() { try { NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterf ...