Как ускорить преобразование массива шорт в растровое изображение в Котлине - PullRequest
1 голос
/ 23 июня 2019

Я получаю данные от датчика глубины, используя Vendor API. Этот API предоставляет изображения в виде массива шорт, но исходные данные от датчика - это массив uint8, который вызывает искажение изображения, и мне нужно, чтобы корректный массив отображался на изображении. Кроме того, я должен сделать раскраску этого изображения, чтобы показать глубину на этом изображении. Эти операции приводят к тому, что на ЦП уходит много времени, и я могу отображать только несколько кадров в секунду. Есть ли способ увеличить скорость этого преобразования?

Я мигрировал из ImageView в SurfaceView, чтобы занять меньше времени в потоке пользовательского интерфейса, и я выполняю этот код в отдельном потоке. Теперь пользовательский интерфейс отзывчив, но все же требуется почти 200-300 мс, чтобы преобразовать этот кадр в массив целых и раскрасить его, а затем преобразовать в растровое изображение.

    private fun getColors(value: Int, max: Int): IntArray {
        val rgb = IntArray(3)

        val range = value * 7 * 256 / max

        if (range < 256) {
            rgb[2] = range % 256
        } else if (range < 2 * 256) {
            rgb[1] = range % 256
            rgb[2] = 255
        } else if (range < 3 * 256) {
            rgb[1] = 255
            rgb[2] = 255 - range % 256
        } else if (range < 4 * 256) {
            rgb[0] = range % 256
            rgb[1] = 255
            rgb[2] = 0
        } else if (range < 5 * 256) {
            rgb[0] = 255
            rgb[1] = 255 - range % 256
        } else if (range < 6 * 256) {
            rgb[0] = 255
            rgb[1] = 0
            rgb[2] = range % 256
        } else {
            rgb[0] = 255
            rgb[1] = if(range > 7*255) 255 else range % 256
            rgb[2] = 255
        }

        return rgb
    }

    private fun updateDepthImage(depth: DepthImage): Bitmap {
        val table = depth.data //array of shorts
        val inttab = IntArray(table.size / 2)


    // Correct align of the table and convert it to table of Int 
        for (i in 0 until table.size / 2) {
            var sum = (table[2 * i].toInt() and 0xff) + (table[2 * i + 1].toInt() and 0xFF shl 8)//*255/2367;
            if (sum > 10000) {
                sum = 10000
            }
            inttab[i] = sum
        }
        val max = 10000

    // Color correction
        for (i in inttab.indices) {
            val rgb = getColors(inttab[i], max)
            val color = -0x1000000 or (rgb[0] shl 16) or (rgb[1] shl 8) or rgb[2]
            inttab[i] = color
        }

        val bitmap = Bitmap.createBitmap(inttab, 640, 480, Bitmap.Config.ARGB_8888)

        return bitmap
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...