Android:实时图像处理

Posted

技术标签:

【中文标题】Android:实时图像处理【英文标题】:Android: Real Time Image Processing 【发布时间】: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 采用这种方法?

非常感谢

【问题讨论】:

【参考方案1】:

我也做过类似的事情。我所做的是扩展相机视图。我不认为相机视图每帧都会更新,而是检索。只有您更改的视图才需要更新。 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:实时图像处理的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV,Android:从图像中检测对象而不是实时检测

如何在android中使用USB吉他接口实时处理音频?

如何在 Android 中的相机捕获图像上设置实时帧

使用“android-vision”库保存实时检测到的人脸(跟踪人脸)图像

ROS实时采集Android的图像和IMU数据

如何在实时数据库firebase android中存储下载图像url