在函数内部调用Renderscrip内核

时间:2019-02-28 19:36:02

标签: android renderscript android-renderscript

我正在尝试在同一Renderscript文件中的函数内调用Renderscript内核,但是我不知道该怎么做(Google文档并没有真正的帮助)。

所以我想称呼这个内核:

uchar __attribute__((kernel)) nextPixel(uint32_t x) {
    tImgIndexB = (uint32_t) (lBlackX[rsGetElementAt_uchar(num, x)] + lX) * 426 + (lBlackY[rsGetElementAt_uchar(num, x)] + lY);
    tImgIndexW = (uint32_t) (lWhiteX[rsGetElementAt_uchar(num, x)] + lX) * 426 + (lWhiteY[rsGetElementAt_uchar(num, x)] + lY);
    if (tImg[tImgIndexB] == 0 && tImg[tImgIndexW] == 1) {
        output = 1;
        tImg[lX*426+lY] = 3;
        //lX += lBlackX[rsGetElementAt_uchar(num, x)];
        //lY += lBlackY[rsGetElementAt_uchar(num, x)];
    } else {
        output = 0;
    }
    return output;
}

变成这样的函数:

void function() {
    // call kernel 'nextPixel'
}

谢谢。

2 个答案:

答案 0 :(得分:1)

这实际上并不是打算使用RS的方式。 RS引擎使用适当的数据调用您的内核,而您的内核可以调用其他函数。但是,在RS代码调用RS内核中包含功能并不是正常情况。

答案 1 :(得分:0)

我从相机获得一帧,上面有一条线(从底边的某处开始)。我需要在两个数组中获取行的左右边缘的每个像素(一个用于左边缘,一个用于右边缘),数组的第一个元素是底部边缘的像素,最后一个数组中的元素,位于左侧,顶部或右侧边缘的像素。

我从相机获得的镜框在YUV中。因此,我使用Renderscript将其转换为二进制图像(黑色线条,白色背景)。

我可以将已处理的帧发送回Java,将其设置在位图中,然后在位图上进行线检测。但是,将数据读取和写入位图的速度很慢(我需要使其尽可能快),因此我尝试使用Renderscript进行所有操作。在我的第一篇文章中发布的内核会寻找该行中的下一个像素(有8种可能性,因此我想同时检查这8种可能性)。