Android Renderscript-获取邻居像素

Android Renderscript-获取邻居像素,android,renderscript,Android,Renderscript,我开始探索renderscript的威力 尝试使用2D图像数据,我可以将像素转换为其他像素。 然而,如何从输入分配中获得相邻像素呢 例如,当需要相邻像素操作时,内置的卷积3x3过滤器是如何工作的,它可以很好地将像素夹在图像的边缘 假设我有功能 void root(const uchar4 *v_in, uchar4 *v_out) { float4 f4 = rsUnpackColor8888(*v_in); // do something on pixel uchar4 u4

我开始探索renderscript的威力

尝试使用2D图像数据,我可以将像素转换为其他像素。 然而,如何从输入分配中获得相邻像素呢

例如,当需要相邻像素操作时,内置的卷积3x3过滤器是如何工作的,它可以很好地将像素夹在图像的边缘

假设我有功能

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;
}

我真的应该像[1]中的v_或[k]中的v_那样索引v_来获取其他像素吗?或者是否有一些聪明的rs*函数来获取相邻的水平/垂直像素,同时提供适当的图像大小钳位,这样我就不会将数组中的v_索引超出其大小?

如果您想查看相邻像素(并且您正在使用rs_分配),您应该只使用一个全局rs_分配,而不是将其作为*v_传入。这看起来像:

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_分配实现自动夹紧,但是您可以调整代码以手动执行边缘夹紧。将maxX、maxY保留为传递给脚本的全局变量,然后动态检查您是否在任何rsGetElementAt*()之前的范围内。如果您确实想要自动夹紧/环绕行为,还可以查看rs_sampler和rsSample()API。

如果您想要查看相邻像素(并且您正在使用rs_分配),您应该只使用单个全局rs_分配,而不是将其作为*v_传入。这看起来像:

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_分配实现自动夹紧,但是您可以调整代码以手动执行边缘夹紧。将maxX、maxY保留为传递给脚本的全局变量,然后动态检查您是否在任何rsGetElementAt*()之前的范围内。如果您确实想要自动夹紧/包装行为,还可以查看rs_sampler和rsSample()API。

Hm,但SDK Tools 22.0.1出现错误:SDK级别11-15不支持非根计算内核doSomething()。这是一些新的尚未发布的API吗?哦,我只是使用了内核的新语法(按值传递),而不是指针的东西。如果您愿意,您可以将我编写的代码转换为使用输出指针(*v_out)。好的,仍然很混乱,RS语法的各种版本等等。我将等待官方RS API 18或它的调用,然后重试。谢谢.Hm,但我在SDK Tools 22.0.1中遇到错误:在SDK级别11-15中不支持非根计算内核doSomething()。这是一些新的尚未发布的API吗?哦,我只是使用了内核的新语法(按值传递),而不是指针的东西。如果您愿意,您可以将我编写的代码转换为使用输出指针(*v_out)。好的,仍然很混乱,RS语法的各种版本等等。我将等待官方RS API 18或它的调用,然后重试。谢谢