2013-03-18 69 views
0

我想通过使用Neon intrinsics作为练习来减去两个图像(灰度),我不知道用C intrinsics减去两个向量的最佳方法是什么。使用NEON减去两个图像

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; 

    } 

} 
+0

编译后使用'objdump'并检查生成的二进制文件的程序集。如果它看起来够好,那就够好了。 – auselen 2013-03-18 17:04:04

+0

@auselen它不编译,uint8x8x3_t subPixels = vsub_u8(srcPixels,dstPixels); – 2013-03-18 17:12:13

+2

如果这些只是灰度图像,那么您不想使用3种组件类型和内在函数 - 使用'uint8x16_t'作为数据类型,然后使用普通的16字节加载和存储。 – 2013-03-18 17:19:11

回答

2

看起来您正在使用错误类型的加载和存储。你从三个频道的例子中复制了这个吗?我想这是你所需要的:

#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的倍数。另外,你需要包括图像的所有行,因为它似乎是你的代码只处理第一行(也许你知道这一点,并简单地减少了示例)。