как получить растровые данные из потока камеры дрона. приложение для Android

#android #dji-sdk

#Android #dji-sdk

Вопрос:

В настоящее время я использую videofeeder класс и DJICodecManager для потоковой camera view передачи в свое приложение я хотел бы получить bitmap/rgba данные этого канала, чтобы использовать их в качестве входных данных для object алгоритма обнаружения.

Комментарии:

1. У вас есть решение для этого?

Ответ №1:

Может быть, немного уродливое решение, но оно работает очень хорошо!

Отобразите fpvview и считайте оттуда растровое изображение. Это быстро, а вы этого не делаете, и, похоже, достаточно быстро для отслеживания в реальном времени.

 public Bitmap getFrameBitmap() {
return fpvWidget.getBitmap();
}
  

Ответ №2:

Другой подход (не уверен, насколько он отличается от решения Mat с точки зрения производительности — возможно, хуже) основан на следующей демонстрации: https://github.com/godfreynolan/DJITutorialsKotlin/tree/main/9-VideoDecoder

Который устанавливает обратный вызов YUV, а затем превращает изображение YUV в растровое изображение. Извлечение только важных частей:

 class MainActivity : Activity(), DJICodecManager.YuvDataCallback {
    private var mCodecManager: DJICodecManager

    ...
    // In some initialization code
    mCodecManager?.enabledYuvData(true)
    mCodecManager?.yuvDataCallback = this

    override fun onYuvDataReceived(
        format: MediaFormat,
        yuvFrame: ByteBuffer?,
        dataSize: Int,
        width: Int,
        height: Int
    ) {
        println("YUV data received - wxh: $width x $height, size: $dataSize.  Frame: $yuvFrame")
        if ((yuvFrame != null)) {
            isProcessing = true
            val bytes = ByteArray(dataSize)
            yuvFrame[bytes]  // This actually does something!
            println("Attempting to set last cap image... count=$count")
            val start = System.currentTimeMillis()
            val yuvImage = createYuvImage(bytes, width, height)
            val bitmap = YuvImageToBitmap(yuvImage!!)
...



private fun createYuvImage(yuvFrame: ByteArray, width: Int, height: Int): YuvImage? {
    print("Screenshot!!")
    if (yuvFrame.size < width * height) {
        return null
    }
    println("YUV frame size: ${yuvFrame.size}")
    val length = width * height
    val u = ByteArray(width * height / 4)
    val v = ByteArray(width * height / 4)
    for (i in u.indices) {
        u[i] = yuvFrame[length   i]
        v[i] = yuvFrame[length   u.size   i]
    }
    for (i in u.indices) {
        yuvFrame[length   2 * i] = v[i]
        yuvFrame[length   2 * i   1] = u[i]
    }

    val yuvImage = YuvImage(
        yuvFrame,
        ImageFormat.NV21,
        width,
        height,
        null
    )
    return yuvImage
}

fun YuvImageToBitmap(yuvImage: YuvImage): Bitmap {
    val out = ByteArrayOutputStream()
    yuvImage.compressToJpeg(Rect(0, 0, yuvImage.width, yuvImage.height), 50, out)
    val imageBytes = out.toByteArray()
    val opt = BitmapFactory.Options()
    opt.inMutable = true
    val image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size, opt)
    return image
}