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:从图像中检测对象而不是实时检测