0

我在快速访问无符号字符数组时遇到了一些麻烦。

我想实际将 BGRABGRA....BGRABGRA.... 逐行编码图像数组复制到使用三层的 OpenCV 版本。下面的代码运行良好,但速度很慢(640*480 图像大约需要 0.5 秒)。我指出取消引用运算符 * 使它变慢。你有任何计划如何解决这个问题吗?(提示:BYTE 是无符号字符)

// run thorugh all pixels and copy image data
for (int y = 0; y<imHeight; y++){
    BYTE* pLine= vrIm->mp_buffer + y * vrIm->m_pitch;
    for (int x = 0; x<imWidth; x++){
        BYTE* b= pLine++; // fast pointer operation
        BYTE* g= pLine++;
        BYTE* r= pLine++;
        BYTE* a= pLine++; // (alpha)
        BYTE bc = *b; // this is really slow!
        BYTE gc = *g; // this is really slow!
        BYTE rc = *r; // this is really slow!

    }
}

谢谢!

4

2 回答 2

1

不应该 - 除非您在 8086 上执行此操作,否则 640x480 不可能花费 0.5 秒。还有其他代码您没有显示吗?目标内存目前没有去任何地方

ps 看看 cvCvtColor() 它使用优化的 SSE2/SIMD 指令来执行此操作

于 2011-02-09T17:24:33.920 回答
0

您正在读取的内存位于什么硬件上?也许该设备对其使用的内存的带宽有限,或者只是具有较慢的 RAM。如果内存由许多设备共享,那么它的访问也可能存在瓶颈。尝试使用 memcpy() 将整个屏幕(?)读取到本地内存,在本地 RAM 中对其执行操作,然后使用 memcpy() 将其写回。这会将您必须协商访问它的次数从 640*480 减少到 1。

于 2011-02-09T19:27:30.300 回答