SIGSEGV при преобразовании изображения YUV_420_888 в RGB_565 для распознавания лиц - PullRequest
0 голосов
/ 05 апреля 2020

Мне трудно использовать RenderScript для преобразования YUV_420_888 изображения в RGB_565. Программа SIGSEGV -ing, учитывая мои звонки на rsGetElementAtYuv_uchar_U и rsGetElementAtYuv_uchar_V; Я подозреваю, что распределение ввода не объявлено правильно.

Вот мой RenderScript:

#pragma version(1)
#pragma rs java_package_name(com.enware.hwdgd)
#pragma rs_fp_relaxed

rs_allocation gIn;

uchar2 RS_KERNEL yuv_to_rgb565_frames(uint32_t x, uint32_t y)
{
    uchar yC = rsGetElementAtYuv_uchar_Y(gIn, x, y);
    uchar uC = rsGetElementAtYuv_uchar_U(gIn, x, y);
    uchar vC = rsGetElementAtYuv_uchar_V(gIn, x, y);

    uchar4 rgb = rsYuvToRGBA_uchar4(yC, uC, vC);

    uchar2 out = rgb.r << 11 | rgb.g << 5 | rgb.b;

    return out;
}

... и вот мое расширение Image, которое вызывает вышеупомянутый RenderScript:

private fun Image.toFaceDetectorBitmap(
    renderScript: RenderScript,
    script: ScriptC_yuv_to_rgb565
): Bitmap {
    val source = Allocation.createTyped(
        renderScript,
        Type.createXY(
            renderScript,
            Element.createPixel(
                renderScript,
                Element.DataType.UNSIGNED_8,
                Element.DataKind.PIXEL_YUV
            ),
            this.width,
            this.height
        )
    )

    val targetBitmap = Bitmap.createBitmap(this.width, this.height, Bitmap.Config.RGB_565)
    val target = Allocation.createTyped(
        renderScript,
        Type.createXY(renderScript, Element.U8_2(renderScript), this.width, this.height)
    )

    val yBuffer = planes[0].buffer
    val uBuffer = planes[1].buffer
    val vBuffer = planes[2].buffer

    val yuvBuffer =
        ByteBuffer.allocate(yBuffer.remaining() + uBuffer.remaining() + vBuffer.remaining())
            .put(yBuffer)
            .put(uBuffer)
            .put(vBuffer)

    source.copyFrom(yuvBuffer.flip().array())
    script._gIn = source

    script.forEach_yuv_to_rgb565_frames(target)

    targetBitmap.copyPixelsFromBuffer(target.byteBuffer)

    source.destroy()
    target.destroy()

    return targetBitmap
}

Я видел несколько свернутых вручную примеров YUV RenderScript , но я думаю, что я смогу использовать существующие внутренние свойства Android.

Спасибо за любые помощь.

...