#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
}