2013-07-01 3 views
1

Я начинаю исследовать силу renderscript.Renderscript - получение соседнего пикселя

Попытка с данными 2D-изображения, я могу преобразовать пиксель в некоторый другой пиксель. Однако, как можно получить соседние пиксели от распределения ввода?

Я так же, как, например, встроенный фильтр convolve3x3, когда ему нужны соседние пиксели для работы, и он красиво захватывает пиксели на краю изображения.

там Предполагая, что у меня есть функцию

void root(const uchar4 *v_in, uchar4 *v_out) { 
    float4 f4 = rsUnpackColor8888(*v_in); 
    // do something on pixel 
    uchar4 u4 = rsPackColorTo8888(f4); 
    *v_out = u4; 
} 

я действительно должен индексировать v_in как v_in [1] или v_in [к], чтобы получить другие пиксели, или некоторые умные RS * функция, чтобы получить смежно по горизонтали/вертикальные пиксели, обеспечивая при этом правильный размер зажима для изображения, чтобы я не индексировал массив v_in из его размера?

ответ

1

Если вы хотите посмотреть на соседние пиксели (и вы используете rs_allocations), вы должны просто использовать один глобальный rs_allocation, а не передавать его как * v_in. Это будет выглядеть так:

rs_allocation in; 

// Using the new kernel syntax where v_out becomes the return value. 
uchar4 __attribute__((kernel)) doSomething(uint32_t x, uint32_t y) { 
    uchar4 u4 = rsGetElementAt_uchar4(in, x, y); // You can adjust x,y here to get neighbor values too. 
    float4 f4 = rsUnpackColor8888(u4); 
    ... 
    return rsPackColorTo8888(f4); 
} 

К сожалению, нет хорошего способа получить автоматический зажим с обычным rs_allocation, но вы можете настроить свой код, чтобы сделать зажим края вручную. Храните maxX, maxY, как глобальные переменные, переданные в Script, а затем динамически проверяйте, находитесь ли вы в диапазоне до любого rsGetElementAt *(). Если вам нужно автоматическое поведение прижима/обертывания, вы также можете проверить API-интерфейсы rs_sampler и rsSample().

+0

Хм, но я получаю сообщение об ошибке с SDK Tools 22.0.1: Некорневое вычислительное ядро ​​doSomething() не поддерживается на уровнях SDK 11-15. Это новый, еще не выпущенный API? –

+0

О, я просто использовал новый синтаксис для ядер (которые передают по значению) вместо данных указателя. Вы можете преобразовать код, который я написал, чтобы использовать выходной указатель (* v_out), если хотите. –

+0

Хорошо, все это путано, разные версии синтаксиса RS и т. Д. Я буду ждать официального RS API 18 или его вызова, а затем повторите попытку. Благодарю. –

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