gpt4 book ai didi

Android:实时图像处理

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:00 25 4
gpt4 key购买 nike

我有一个应用程序可以进行相机预览,对每一帧执行一些基本的图像处理功能(例如边缘检测、颜色变化、图像扭曲等),并“实时”在屏幕上显示修改后的帧。类似于 Android Market 中的“Paper Camera”应用程序。

我的方法总结:

1:在框架布局中创建两个重叠的 View :

要传递给 Camera.setPreviewDisplay() 的 SurfaceView。 (传递 null 会阻止相机预览在某些设备上启动 - opencv 在 Android 4.0 之前曾经这样做过吗?)。

一个名为“LiveView”的类,它扩展了 View 并实现了 Camera.PreviewCallBack。此 View 从相机接收帧,并在修改后显示帧(例如边缘检测)。此 View 位于 SurfaceView 之上。

2:我调用 Camera.setPreviewCallbackWithBuffer(),以便将帧发送到我的 LiveView

3:在 LiveView 的 onPreviewFrame() 中,我获取捕获的帧 (byte[]),从 YUV 转换为 RGB 并执行图像处理功能,然后调用 postInvalidate()(YUV2RGB 转换和图像处理在 native 代码中完成)

4:在 LiveView 的 OnDraw() 方法中,我从修改后的 RGB 帧 (byte[]) 创建一个位图,并将位图绘制到 Canvas 上。

这可行(在各种设备上介于 5fps 和 10fps 之间),但我想听听其他人是如何解决这个问题的,以及如何改进它。特别是:

  • 我会通过扩展 GLSurfaceView 而不是 View 来创建 LiveView 类来获得任何性能吗?
  • 为每一帧更新两个表面听起来效率很低。有其他选择吗?
  • 为了更有效地做到这一点,我应该在 native 级别访问相机吗? - 我相信 OpenCV 采用这种方法?

非常感谢

最佳答案

我也做过这样的事情。我所做的是扩展相机 View 。我不认为相机 View 每帧都会更新,但会被检索。并且只有您更改的 View 才需要更新。OpenCv 确实比原生相机做得更好。导入 org.opencv.highgui.VideoCapture 后,您可以使用以下方式直接访问相机:

VideoCapture camera;
camera.retrieve(mGrayMat, Highgui.CV_CAP_ANDROID_GREY_FRAME);

将mGrayMat转换为mRgbaMat:(org.opencv.imgproc.Imgproc)

Imgproc.cvtColor(mGrayMat, mRgbaMat, Imgproc.COLOR_GRAY2BGRA, 4);

关于Android:实时图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9721306/

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