2

我正在尝试通过使用 Neon 内在函数作为练习来减去两个图像(灰度),我不知道使用 C 内在函数减去两个向量的最佳方法是什么。

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

看起来您使用了错误类型的加载和存储。您是否从三通道示例中复制了此内容?我认为这是你需要的:

#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 回答