0

符号なし文字配列への高速アクセスに問題があります。

BGRABGRA....BGRABGRA.... 行ごとにコード化された画像配列を、3 つのレイヤーを使用する OpenCV バージョンに実際にコピーしたいと考えています。以下のコードは正常に動作しますが、非常に遅いです (640*480 の画像で約 0.5 秒)。逆参照演算子 * を使用すると速度が低下することを指摘しました。これを修正する方法はありますか?(ヒント: BYTE は unsigned char です)

// 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 に答える