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

非常感谢

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 2012-08-18
      • 1970-01-01
      相关资源
      最近更新 更多