Opengl 在几秒钟而不是几小时内旋转数百个JPEG
我们的计算机一次可以获取数百张图像,我们需要尽可能快地旋转和调整它们的大小。 旋转90度、180度或270度 目前,我们正在使用命令行工具旋转图像。旋转图像(5760*3840~22MP)大约需要4到7秒 下面不幸地给出了同样的结果Opengl 在几秒钟而不是几小时内旋转数百个JPEG,opengl,graphics,opencv,opencl,image-rotation,Opengl,Graphics,Opencv,Opencl,Image Rotation,我们的计算机一次可以获取数百张图像,我们需要尽可能快地旋转和调整它们的大小。 旋转90度、180度或270度 目前,我们正在使用命令行工具旋转图像。旋转图像(5760*3840~22MP)大约需要4到7秒 下面不幸地给出了同样的结果 import cv img = cv.LoadImage("image.jpg") timg = cv.CreateImage((img.height,img.width), img.depth, img.channels) # transposed image
import cv
img = cv.LoadImage("image.jpg")
timg = cv.CreateImage((img.height,img.width), img.depth, img.channels) # transposed image
# rotate counter-clockwise
cv.Transpose(img,timg)
cv.Flip(timg,timg,flipMode=0)
cv.SaveImage("rotated_counter_clockwise.jpg", timg)
有没有一种更快的方法可以使用图形卡的功能来旋转图像?我想到了OpenCL和OpenGL,但我们想知道性能是否会显著提高
我们使用的硬件相当有限,因为设备应该尽可能小
- 4 GB内存
- 垂直度3
该软件是debian 6,带有官方(封闭源代码)radeon驱动程序。有一个jpeg无需重新压缩插件,IIRC可以在不重新压缩的情况下旋转和调整图像大小(以简单的方式),它还可以运行一个图像目录-这应该快得多
GPU可能不会有帮助,您几乎可以肯定opencv中的I/O限制,它并不真正适用于高速文件访问您可以执行无损旋转,只需修改EXIF部分即可。这将加快图片的旋转速度 看看jpegtran实用程序,它执行无损jpeg修改。
我不是jpeg和压缩主题方面的专家,但由于您的问题几乎受到I/O限制(假设您可以在不进行大量反编码相关计算的情况下进行旋转),您可能无法在现有GPU上对其进行太多加速。(Un)幸运的是,您的引用是一个非常慢的Atom CPU 我假设Radeon有单独的主存储器。这意味着数据需要通过PCI-E进行通信,与CPU执行相比,这是额外的延迟,在不隐藏数据的情况下,您可以确定这是瓶颈。这就是为什么在GPU上使用OpenCV的代码速度慢的最可能原因(除了执行两个内存绑定操作,转置和翻转,而不是单个操作) 关键是通过使用尽可能多的计算来隐藏PCI-E传输时间。通过使用PCI-E的全双工功能来实现GPU与GPU之间的重叠传输,只有在所讨论的卡具有双DMA引擎(如或)的情况下才会起作用,我对此深表怀疑 如果您的GPU计算时间(GPU执行旋转所需的时间)低于传输所需的时间,您将无法完全重叠。HD4530有一个非常慢的内存接口,只有峰值,而旋转内核应该有相当多的内存限制。然而,我只能猜测,但我要说的是,如果您达到峰值PCI-E传输速率约1.5 Gb/s(4倍PCI-E AFAIK),计算内核的速度将比传输快几倍,并且您将能够很少重叠。 您可以简单地分别对各个部分计时,而不需要复杂的异步代码,并且您可以估计以多快的速度获得具有最佳重叠的内容 你可能要考虑的一件事是获取不显示PCI-E作为瓶颈的硬件,例如:
- -基础系统。在这些平台上,您将能够页面锁定内存,并直接从GPU使用它李>
- 与主机共享主存的集成GPU李>
- 一个快速的低功耗CPU,如移动式Intel Ivy桥接器,其消耗几乎与的一样少,但支持AVX,速度应快几倍
jpegtran
似乎是一个很好的解决方案。它只会部分地重新压缩你的图像,这应该仍然是相当快的。如果图像的宽度/高度是8的倍数,你可以通过简单地重新排列组件而旋转90/180/270度,而不需要任何调整recompression@MartinBeckett:请注意,大多数JPEG图像存储为8维的倍数,仅在之后应用裁剪,因此,jpegtran应该能够为大多数图像重新排序组件。