【问题标题】:Need help getting pixel location for Android Renderscript需要帮助获取 Android Renderscript 的像素位置
【发布时间】:2017-04-07 10:17:17
【问题描述】:

我正在使用 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++;
                }
            }
        }

我将如何在渲染脚本中做同样的事情?谢谢

【问题讨论】:

    标签: android image-processing renderscript


    【解决方案1】:

    你可以试试这样的:

    #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 坐标处的输入分配像素的值填充。

    【讨论】:

    • x 和 y 是如何填充的?我们需要在启动选项中设置 max x 和 max y 吗?
    • x/y 由输入分配的维度填充,您不需要设置启动选项,除非输入分配的维度不利于算法的执行。例如,如果您希望每个内核线程一次处理 2 个或更多像素而不是一个。
    • 哦。这确实有道理。我可以使用分配将脚本中另一个方法的输出传递给下一个方法吗?在我这样做之前我需要重新格式化它吗?另一种方法给我一个位图图像作为输出
    • 是的,一个分配可以是一个内核的输出和另一个内核的输入。您只需要确保类型匹配,例如,如果您有 U8 分配,请在 RS 中使用 uchar。如果您有 RGBA_8888,请使用 uchar4。至于位图图像,有一个方法 Allocation.createFromBitmap 将使用您的位图数据初始化一个分配。
    猜你喜欢
    • 2019-12-31
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多