我有一个应用程序,它可以进行相机预览,在每一帧上执行一些基本的图像处理功能(例如边缘检测,颜色变化,图像扭曲等),并在“实时”中将修改后的帧显示在屏幕上。与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之间),但我想听听别人如何解决这个问题,以及如何改进它。特别是:
非常感谢
答案 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);