【发布时间】:2012-05-28 16:19:03
【问题描述】:
我需要比较 2 张图片并找到与指定阈值不同的像素。 现在我只是在 for 循环中以编程方式进行操作,对于 600x400 的小图片大约需要 3 秒。 我想知道是否有办法使用 OpenGL、DirectX、CUDA 或类似的东西更快地做到这一点?所以它将使用 GPU 而不仅仅是 CPU。 请注意,在输出中我需要一个不同像素的数组,而不仅仅是布尔值,具体取决于它是否相同。
所以我在 delphi 中查看了源代码,它看起来像这样:
function TCanvas.GetPixel(X, Y: Integer): TColor;
begin
RequiredState([csHandleValid]);
GetPixel := Windows.GetPixel(FHandle, X, Y);
end;
似乎每次都调用 WinAPI 函数 GetPixel()。可能这就是它如此缓慢的原因。 所以现在我的问题是:有没有办法通过 WinAPI 获取整个像素数组?我正在使用具有 HBITMAP 的屏幕截图,因此将它与 WinAPI 一起使用不会有问题。
【问题讨论】:
-
"现在我只是在 for 循环中以编程方式进行操作,对于 600x400 的小图片大约需要 3 秒。"用什么语言?这是调试版本吗? 解释的脚本语言可能会比这更快。
-
Nicol Bolas,我使用的是 delphi 7。不,我不认为这是一个调试版本。为什么你认为解释型语言会更快?我一直认为编译语言更快。
-
他们是(在这里挥舞着表演火焰战:P)。 Nicol Bolas(含蓄地)暗示您当前的代码非常未经优化。在考虑迁移到 GPU 之前,您可能应该首先优化您的 CPU 版本。
-
详细地说,对于大多数简单的算法和合理大小的图像,在 CPU 上执行这样的增量可能比将图像加载到 GPU 上更快。要详细了解,请停止使用 canvas.Pixels[]。
-
@user860478:对缓冲区的原始操作。中间没有一些抽象。可能所有访问像素值的函数调用都会影响您的性能。
标签: winapi opengl image-processing graphics cuda