Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 在几秒钟而不是几小时内旋转数百个JPEG_Opengl_Graphics_Opencv_Opencl_Image Rotation - Fatal编程技术网

Opengl 在几秒钟而不是几小时内旋转数百个JPEG

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

我们的计算机一次可以获取数百张图像,我们需要尽可能快地旋转和调整它们的大小。 旋转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

# 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,速度应快几倍

在阅读这个问题时,我想知道自己:这个操作的每个部分花费了多少时间?与实际的旋转操作相比,JPEG编码的等待时间有多长?还有多少等待时间来自磁盘IO?这些问题的答案可能会对您的优化产生影响。只需使用jpeg-tran,这是一个很好的副作用,不会影响质量。您能否为粘贴的代码的每个部分提供时间安排(加载后、转置后、翻转后、保存后)?在这里,您可以找到更多无需再次解压缩和压缩图像即可无损旋转的实用程序:对于大量图像,缓冲和/或异步内存传输可以缓解I/O瓶颈-因此我不会说基于GPU的实现没有帮助。@ananthonline-如果jpeg只是旋转90的倍数,那么您只需重新排列每个8x8块中的压缩值。GPU在这方面并没有真正的帮助,而且在随机内存读/写时通常速度很慢,即使您在卡上有数据。如果重新压缩,速度可能会更快,尽管使用SSE2的DCT非常快-您确实需要重新压缩某些块,因为图像大小已更改,不是吗?对于一个大的图像,即使是那些将受益于大规模并行的GPU。使用GPU时,解码+有损旋转选项变得可行。更改Exif方向标签可能是最快的方法。然而,并不是所有的图像观看者都尊重它
jpegtran
似乎是一个很好的解决方案。它只会部分地重新压缩你的图像,这应该仍然是相当快的。如果图像的宽度/高度是8的倍数,你可以通过简单地重新排列组件而旋转90/180/270度,而不需要任何调整recompression@MartinBeckett:请注意,大多数JPEG图像存储为8维的倍数,仅在之后应用裁剪,因此,jpegtran应该能够为大多数图像重新排序组件。