首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Android中从摄像头流中获取帧?

如何在Android中从摄像头流中获取帧?
EN

Stack Overflow用户
提问于 2014-04-18 18:16:35
回答 3查看 2.6K关注 0票数 1

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

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

我是如何做到的:

代码语言:javascript
运行
复制
 @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        yuvs.add(data);
        rgbText.setText("FRAMES: " + count);
        count++;
    }

yuvs在哪里?

代码语言:javascript
运行
复制
 private ArrayList<byte[]> yuvs;

感谢您的任何建议或代码片段

EN

回答 3

Stack Overflow用户

发布于 2018-12-29 20:19:04

实际上,FPS对光线条件非常敏感,它可以在很大的范围内变化(在我的测试中为8-30)。我不知道任何可靠的方法来提高预览的FPS,但只有建议,如降低分辨率,使用本地API等。我可以建议使用这个lib它提供了与原生https://github.com/natario1/CameraView相同的FPS,但大大减少了代码量。

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

代码语言:javascript
运行
复制
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,你可以非常快速地将其转换为单纯疱疹病毒:

代码语言:javascript
运行
复制
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
    }
票数 1
EN

Stack Overflow用户

发布于 2014-04-18 18:24:29

在你的相机对象上进行设置

代码语言:javascript
运行
复制
setPreviewCallback(Camera.PreviewCallback cb)

等等

代码语言:javascript
运行
复制
Camera.PreviewCallback

覆盖

代码语言:javascript
运行
复制
onPreviewFrame(byte[] data, Camera camera)
票数 0
EN

Stack Overflow用户

发布于 2016-05-03 15:50:26

ArrayList是在游戏、帧渲染等中使用的最差的类。可以试试这个

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

并用byte[][]替换ArrayList<byte[]>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23152020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档