Android:实时图像处理

时间:2012-03-15 14:01:45

标签: android image-processing real-time android-camera

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

我的方法摘要:

1:在framelayout中创建两个重叠的视图:

要传递给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 个答案:

答案 0 :(得分: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);