2

2 つの写真を比較し、指定されたしきい値と異なるピクセルを見つける必要があります。今、プログラムで for ループで実行しています。小さな 600x400 画像の場合、約 3 秒かかります。OpenGL、DirectX、CUDA、またはこのようなものを使用して高速化する方法があるかどうか疑問に思っていますか? そのため、CPU だけでなく GPU も使用します。出力では、同じ画像かどうかに応じてブール値だけでなく、さまざまなピクセルの配列が必要であることに注意してください。

だから私はデルファイのソースを見て、次のように見えます:

function TCanvas.GetPixel(X, Y: Integer): TColor;
begin
  RequiredState([csHandleValid]);
  GetPixel := Windows.GetPixel(FHandle, X, Y);
end;

毎回 WinAPI 関数 GetPixel() を呼び出すようです。おそらくそれがとても遅い理由です。だから今私の質問は: WinAPI 経由でピクセルの配列全体を取得する方法はありますか? HBITMAP を含むスクリーンショットで作業しているので、WinAPI で使用しても問題ありません。

4

4 に答える 4

2

delphi を使用しているため、イメージを TBitmap にロードしてから、プロパティを使用しScanLineてビットマップのピクセルにすばやくアクセスできます。

于 2012-05-22T16:09:20.213 に答える
1

OpenGL や Direct3D を使用してこのような画像操作を行うことは技術的に可能ですが、これは意図したものではありません。彼らはAPIを描いています。CUDA または OpenCL の方が適していますが、画像を比較するような単純なことには完全にやり過ぎです。また、アップロードのオーバーヘッドはパフォーマンスに悪影響を及ぼします。

かなり小さい画像でのこのような単純な画像操作の 3 は、ひどく間違ったことをしていることを意味します。つまり、私のラップトップは FullHD ビデオを h264 にリアルタイムでエンコードできます。これは、画像に対して実行できる最も複雑なタスクの 1 つです。

于 2012-05-22T09:07:55.640 に答える
1

ええ!CUDA/OpenCL を使用して GPU で実行できますが、このケースは GPU で実現できる並列処理を例示しています。たとえば、CUDA では、GPU で 600x400 スレッドを起動し、各ポイントで 2 つの画像のピクセル差を同時に計算します。

つまり、600 回と 400 回の反復回数の 2 つのネストされたfor ループは、GPU 上の 240,000 スレッドによって削除されます。スレッド 0 はポイント 0 でのピクセル差を計算し、スレッド 1 はポイント 1 で、というように計算します。理論的には、すべてのスレッドが GPU 上で並行して実行されます。

欠点: GPU での計算は CPU での計算よりもはるかに高速ですが、最初に画像データを GPU メモリにアップロードし、計算後の結果を CPU メモリに戻す必要があります。全体的な GPU 時間 (計算とメモリ転送を含む) が CPU の計算時間よりも短い場合は、勝ちです。

于 2012-05-22T10:15:08.650 に答える
0

HLSL/GLSL。それらを使用すると、同時に多くのミニスレッドを実行できます。1 つのパフォーマンスは低くなりますが、ピクセル比較には適しています。

于 2012-05-22T09:17:51.360 に答える