我正在使用Android Renderscript来分析从Camera2API收到的预览帧。我打算分析每个像素并根据一些规则(取决于像素的强度和位置)我需要更新计数器。我打算使用ForEach循环但是如何获得像素坐标。
示例java循环是。
for (int i = 0; i < 240; i++)
{
for (int j = 0; j < 320; j++)
{
tempPixelIntensity = image.getPixel(i,j);
x = i;
y = j ;
if(tempPixelIntensity=zzz&x<zzzandy<zzz)
{
counter++;
}
}
}
我如何在renderscript中做同样的事情?感谢
答案 0 :(得分:3)
您可以尝试这样的事情:
#pragma rs_fp_relaxed // needed for some GPUs
uint32_t counter;
void RS_KERNEL process(uchar tempPixelIntensity, uint32_t x, uint32_t y)
{
if(tempPixelIntensity=zzz&x<zzzandy<zzz)
{
rsAtomicInc(&counter);
}
}
RS内核是SPMD(单程序多数据)。因此,您只为单个像素元素编写循环的内部部分,框架执行循环。
在java方面你会做类似的事情:
Type.Builder tb = new Type.Builder(rs, Element.U8(rs));
tb.setX(320);
tb.setY(240);
Allocation input = Allocation.createTyped(rs, tb.create(), Allocation.USAGE_SCRIPT);
script.forEach_process(input);
因此输入分配的维度决定了内核运行的界限。在这种情况下,x将从[0,319]变化,y将从[0,239]变化。内核的x,y参数是由RS运行时填充的特殊参数,类似地,tempPixelIntensity值将由给定x,y坐标处的输入分配像素的值填充。