Канонический способ перебора RGB-каналов в org.bytedeco.javacv.Frame - PullRequest
0 голосов
/ 17 октября 2019

Я думаю, что делаю это медленным способом:

private fun copyFrameToChannels(
    frame: Frame,
    height: Int,
    width: Int,
    channelB: IntArray,
    channelG: IntArray,
    channelR: IntArray
) {
    val bgrIdx: UByteIndexer = frame.createIndexer()
    for (y in 0 until height.toLong()) {
        for (x in 0 until width.toLong()) {
            val location = (y * width + x).toInt()
            // BGR
            channelB[location] = bgrIdx.get(y, x, 0)
            channelG[location] = bgrIdx.get(y, x, 1)
            channelR[location] = bgrIdx.get(y, x, 2)
        }
    }
    bgrIdx.release()
}

Мне нужно получить минимальное и максимальное значения для каждого канала и обработать все значения в пределах канала, но это выглядит как дополнительнаякопировать. Я шел в надежде на val reds:IntArray = frame.getRedChannel()

. Я могу получить «Image» (просто nio.Buffer) с помощью val img = frame.image[0] Даже если это DirectByteBuffer, .array() не поддерживается.

Есть ли способ сделать массовый / быстрый "получить буфер с длиной шага 3", как frame.image[0].efficientEntireChannelToArray(numChannels=3, sourceChannel=2, targetArray=myReds)?

...