【发布时间】:2012-04-01 01:17:48
【问题描述】:
我有一个应用程序,它可以进行相机预览,对每一帧执行一些基本的图像处理功能(例如边缘检测、颜色变化、图像扭曲等),并将修改后的帧“实时”显示到屏幕上。类似于 Android Market 中的“Paper Camera”应用。
我的方法总结:
1:在一个framelayout中创建两个重叠的View:
要传递给 Camera.setPreviewDisplay() 的 SurfaceView。 (传递 null 会阻止在某些设备上启动相机预览 - opencv 在 Android 4.0 之前曾经这样做过吗?)。
一个名为“LiveView”的类,它扩展了 View 并实现了 Camera.PreviewCallBack。此视图从相机接收帧,并显示修改后的帧(例如边缘检测)。此视图位于 SurfaceView 之上。
2:我调用Camera.setPreviewCallbackWithBuffer(),以便将帧发送到我的LiveView
3:在LiveView的onPreviewFrame()中,我把抓到的帧(byte[]),从YUV转换成RGB并进行图像处理函数,调用postInvalidate()(YUV2RGB转换和图像处理是在本机代码中完成的)
4:在 LiveView 的 OnDraw() 方法中,我从修改后的 RGB 帧(byte[])创建位图,并将位图绘制到画布上。
这可行(在各种设备上介于 5fps 和 10fps 之间),但我想听听其他人是如何解决这个问题的,以及如何改进它。特别是:
- 我是否可以通过扩展 GLSurfaceView 而不是 View 来创建 LiveView 类来获得任何性能?
- 每帧更新两个表面听起来效率很低。有替代方案吗?
- 要更有效地执行此操作,我应该在本机级别访问相机吗? - 我相信 OpenCV 采用这种方法?
非常感谢
【问题讨论】:
标签: android image-processing real-time android-camera