2

演習としてネオン組み込み関数を使用して2つの画像(グレースケール)を減算しようとしていますが、C組み込み関数を使用して2つのベクトルを減算する最良の方法がわかりません。

void subtractTwoImagesNeonOnePass( uint8_t *src, uint8_t*dest, uint8_t*result, int srcWidth)
{


    for (int i = 0; i<srcWidth; i++)
    {
        // load 8 pixels
        uint8x8x3_t srcPixels  = vld3_u8 (src);
        uint8x8x3_t dstPixels  = vld3_u8 (src);
        // subtract them
        uint8x8x3_t subPixels =  vsub_u8(srcPixels, dstPixels);
        // store the result
        vst1_u8 (result, subPixels);
        // move 8 pixels
        src+=8;
        dest+=8;
        result+=8;

    }

}
4

1 に答える 1

4

間違った種類のロードとストアを使用しているようです。これを3チャンネルの例からコピーしましたか?私はこれがあなたが必要としているものだと思います:

#include <stdint.h>
#include <arm_neon.h>

void subtractTwoImagesNeon( uint8_t *src, uint8_t*dst, uint8_t*result, int srcWidth, int srcHeight)
{
    for (int i = 0; i<(srcWidth/8); i++)
    {
        // load 8 pixels
        uint8x8_t srcPixels = vld1_u8(src);
        uint8x8_t dstPixels = vld1_u8(dst);
        // subtract them
        uint8x8_t subPixels = vsub_u8(srcPixels, dstPixels);
        // store the result
        vst1_u8 (result, subPixels);
        // move 8 pixels
        src+=8;
        dst+=8;
        result+=8;
    }
}

また、srcWidthが8の倍数であることも確認する必要があります。また、コードは最初の行のみを処理するように見えるため、画像のすべての行を含める必要があります(これを知っていて、シンプルさ)。

于 2013-03-18T18:22:23.017 に答える