2013-03-18 9 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

+0

@auselen Не компилируется, возникает проблема с uint8x8x3_t subPixels = vsub_u8 (srcPixels, dstPixels); –

+2

Если это только изображения с оттенками серого, вы не хотите использовать 3 типа компонентов и встроенные функции - используйте 'uint8x16_t' в качестве вашего типа данных, а затем используйте обычные 16-байтовые нагрузки и сохраните. –

ответ

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. Кроме того, вам нужно включить все строки изображения, как это кажется, что ваш код только ручки в первой строке (возможно, вы это знаете и просто сократите пример для простоты).

Смежные вопросы