3

コンピューターが一度に取得する何百もの画像があり、それらをできるだけ速く回転およびサイズ変更する必要があります。回転は、90 度、180 度、または 270 度で行われます。

現在、コマンド ライン ツールGraphicsMagickを使用して画像を回転させています。画像の回転 (5760*3840 ~ 22MP) には約 4 ~ 7 秒かかります。

次のpython コードは悲しいことに、同等の結果をもたらします

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 です。

4

3 に答える 3

12

EXIF セクションを変更するだけのロスレス ローテーションを実行できます。これにより、写真がより速く回転します。

ロスレス jpeg 変更を実行する jpegtran ユーティリティを見てください。 https://linux.die.net/man/1/jpegtran

于 2012-07-09T14:33:32.777 に答える
4

irfanview用の jpeg 非再圧縮プラグインがあり、IIRC は再圧縮せずに画像を (簡単な方法で) 回転およびサイズ変更できます。また、画像のディレクトリを実行することもできます。これははるかに高速になるはずです。

GPU はおそらく役に立たないでしょう。ほとんどの場合、opencv では I/O が制限されています。高速ファイル アクセスには最適化されていません。

于 2012-07-09T14:27:10.273 に答える
1

私は jpeg と圧縮のトピックの専門家ではありませんが、あなたの問題はほとんど I/O が制限されているため (大量のデ/エンコード関連の計算なしで回転できると仮定して)、できない可能性があります。あなたが持っているGPUでそれを非常に高速化します。(Un)幸いなことに、あなたのリファレンスはかなり遅い Atom CPU です。

Radeon には別のメイン メモリがあると思います。これは、データが PCI-E を介して通信される必要があることを意味します。これは、CPU の実行に比べて余分なレイテンシであり、それがボトルネックであることを隠すことなく確認できます。これが、GPU で OpenCV を使用するコードが遅くなる最も可能性の高い理由です (1 つの操作ではなく、転置と反転という 2 つのメモリにバインドされた操作を実行するという事実に加えて)。

重要なことは、複数のバッファリングを使用して、できるだけ多くの PCI-E 転送時間を計算で隠すことです。PCI-E の全二重機能を利用して GPU との間でオーバーラップする転送は、問題のカードがハイエンド RadeonNVIDIA Quadro/Tesla カードのようなデュアル DMA エンジンを搭載している場合にのみ機能します--私はそれを非常に疑っています。

GPU の計算時間 (GPU がローテーションを行うのにかかる時間) が転送にかかる時間よりも短い場合、完全にオーバーラップすることはできません。HD 4530 のメモリ インターフェイスは非常に遅く、ピーク時はわずか12.8 Gb/sであり、ローテーション カーネルはかなりメモリに依存しているはずです。ただし、推測することしかできませんが、最大 PCI-E 転送速度が ~1.5 Gb/s (PCI-E AFAIK の 4 倍) に達すると、コンピューティング カーネルは転送よりも数倍高速になると思います。オーバーラップすることはほとんどありません。精巧な非同期コードを必要とせずに、パーツを別々に単純にタイミングを合わせることができ、最適なオーバーラップでどれだけ速く取得できるかを見積もることができます。

考慮すべきことの 1 つは、PCI-E をボトルネックとして示さないハードウェアを入手することです。たとえば、次のようになります。

  • AMD APUベースのシステム。これらのプラットフォームでは、メモリをページロックし、GPU から直接使用できます。
  • ホストとメイン メモリを共有する統合 GPU。
  • i5-3427Uなどのモバイル Intel Ivy Bridge のような高速で低電力の CPU 。消費電力はAtom D525とほぼ同じですが、AVX をサポートしており、数倍高速です。
于 2012-07-10T23:15:10.987 に答える