我们的计算机一次有数百张图像,我们需要尽可能快地旋转和调整它们。 旋转完成90度,180度或270度。
目前,我们正在使用命令行工具GraphicsMagick来旋转图片。旋转图像(5760 * 3840~22MP)大约需要4到7秒。
以下python code遗憾地给了我们相同的结果
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,但我们想知道性能提升是否值得注意。
我们使用的硬件相当有限,因为设备应该尽可能小。
该软件是官方(闭源)radeon驱动程序的debian 6。
答案 0 :(得分:11)
您可以执行无损旋转,只需修改EXIF部分。这样可以更快地旋转图片。
并查看执行无损jpeg修改的jpegtran实用程序。 http://linuxmanpages.com/man1/jpegtran.1.php
答案 1 :(得分:4)
irfanview有一个jpeg无再压缩插件,IIRC可以旋转和调整图像大小(以简单的方式)而无需重新压缩,它还可以运行一个图像目录 - 这应该快得多
GPU可能无济于事,你几乎可以肯定我在opencv中受限于I / O,它并不是真正用于高速文件访问的
答案 2 :(得分:1)
我不是jpeg和压缩主题的专家,但是因为你的问题几乎与I / O有限(假设你可以旋转而没有重度de /编码相关的计算),你可能不会能够在你拥有的GPU上加速它。 (联合国)幸运的是你的参考是一个非常慢的Atom CPU。
我认为Radeon有独立的主内存。这意味着数据需要通过PCI-E进行通信,这是与CPU执行相比的额外延迟,并且没有隐藏,您可以确定它是瓶颈。这是你在GPU上使用OpenCV的代码很慢的最可能的原因(除了你执行两个内存限制操作,转置和翻转,而不是单个操作)。
关键是通过使用multiple-buffering尽可能多地隐藏PCI-E传输时间。通过利用PCI-E的全双工功能进行计算,重叠转移到GPU和从GPU转移只有在有问题的卡具有high-end Radeons或NVIDIA Quadro/Tesla cards的双DMA引擎时才能工作 - - 我非常怀疑。
如果您的GPU计算时间(GPU进行旋转所需的时间)低于传输所需的时间,您将无法完全重叠。 HD 4530的存储器接口非常慢,只有12.8 Gb/s峰值,旋转内核应该有很大的内存限制。但是,我只能猜测,但我会说,如果达到峰值PCI-E传输速率~1.5 Gb / s(4x PCI-E AFAIK),计算内核将比传输速度快几倍,你就是'能够重叠很少。 您可以简单地对零件进行单独计时,而无需精心设计的异步代码,您可以估算出最佳重叠的速度。
您可能想要考虑的一件事是获得不会将PCI-E作为瓶颈的硬件,例如: