gpt4 book ai didi

android - 如何从 Android 中的相机流中获取帧?

转载 作者:行者123 更新时间:2023-11-30 02:56:43 29 4
gpt4 key购买 nike

我正在为 Android 开发一种研究应用程序。我正在处理的子任务是从相机的实时视频流中获取一帧。我试图从 SurfaceView 源获取它(并解码 YUV -> RGB -> HSV),但 FPS 太低(大约 5-7 FPS)。

所以,请告诉我,如何直接从相机视频流中获取视频帧(一些低级的东西,比如 onFrameChanged())

我是怎么做到的:

 @Override
public void onPreviewFrame(byte[] data, Camera camera) {
yuvs.add(data);
rgbText.setText("FRAMES: " + count);
count++;
}

yuvs在哪里

 private ArrayList<byte[]> yuvs;

感谢您的任何帮助或代码 fragment

最佳答案

实际上,FPS 对光线条件非常敏感,它可以在很宽的范围内变化(在我的测试中为 8-30)。我不知道有什么可靠的方法可以增加预览的 FPS,但只有降低分辨率、使用 native API 等建议。我可以建议使用这个库 https://github.com/natario1/CameraView - 它提供与 native API 相同的 FPS,但显着减少了代码量。

这是一个获取 RGB 位图的示例(Kotlin):

cameraView.addFrameProcessor { frame ->
if(frame!=null) {
val data = frame.data
val size = frame.size
// Process...
// cameraView.previewSize

val yuvImage = YuvImage(data, ImageFormat.NV21, size.width, size.height, null)
val os = ByteArrayOutputStream()
yuvImage.compressToJpeg(Rect(0, 0, size.width, size.height), 100, os)
val jpegByteArray = os.toByteArray()
var bitmap = BitmapFactory.decodeByteArray(jpegByteArray, 0, jpegByteArray.size)
}
}

使用 openCV,您可以非常快速地将其转换为 HSV:

val bmp = convert(bitmap, Bitmap.Config.ARGB_8888)
var mat = Mat(bmp.width, bmp.height, CvType.CV_8UC4)
Utils.bitmapToMat(bmp, mat)
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2HSV)

fun convert(bitmap: Bitmap, config: Bitmap.Config): Bitmap {
val convertedBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, config)
val canvas = Canvas(convertedBitmap)
val paint = Paint()
paint.color = Color.BLACK
canvas.drawBitmap(bitmap, 0F, 0F, paint)
return convertedBitmap
}

关于android - 如何从 Android 中的相机流中获取帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23152020/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com