2012-03-15 151 views
9

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

我的方法的总结:

1:创建一个的FrameLayout两个重叠的次数:

甲SurfaceView传递给Camera.setPreviewDisplay()。 (传递null会阻止在某些设备上启动摄像头预览 - 在Android 4.0之前,opencv会使用它来执行此操作)。

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

2:我请Camera.setPreviewCallbackWithBuffer(),使得帧被发送到我的实时查看

3:)的实时查看的在onPreviewFrame(我走捕获的帧(字节[])从YUV转换为RGB,并执行图像处理功能,并调用postInvalidate()(的YUV2RGB转换和图像处理是在本机代码执行)

4:在实时查看的的OnDraw()方法,创建一个从修改的RGB帧(byte [])中获取位图,并将该位图绘制到画布。

此作品(5fps的和在各种设备之间10fps的),但我想听听别人怎么接触过这个问题,如何可以改善。特别是:

  • 我会通过扩展GLSurfaceView而不是View来创建LiveView类来获得任何性能吗?
  • 这听起来非常低效,因为每个框架都要更新两个曲面。有其他选择吗?
  • 要更有效地做到这一点,我应该在本机级别访问摄像机吗? - 我相信OpenCV采用这种方法?

非常感谢

回答

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);