安卓:实时图像处理

9
我有一个应用程序,它获取相机预览,在每个帧上执行一些基本的图像处理功能(例如边缘检测,颜色更改,图像变形等),并在“实时”显示修改后的帧屏幕上。类似于Android市场上的“Paper Camera”应用程序。
我的方法概述如下:
1. 在framelayout中创建两个重叠的视图: - 一个SurfaceView传递给Camera.setPreviewDisplay()。(在某些设备上,传递null会防止相机预览启动-在Android 4.0之前,opencv使用此方法?) - 一个名为“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个回答

4
我也做过类似的事情。我的做法是扩展相机视图。我认为相机视图不是每帧都更新,而是被检索。只有你改变的视图需要更新。 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接