Opencv For Android: 如何显示摄像头预览
来源:互联网 发布:tenga淘宝 编辑:程序博客网 时间:2024/06/07 07:15
它是在 CameraBridgeBase 这个类里有一个 方法,
deliverAndDrawFrame(CvCameraViewFrame ),
在这个函数里面,
它将CvCameraViewListener2 的onCameraFrame 返回的Mat 转换为 bitmap ,
然后通过canvas画在 surfaceView 持有holder的 surface上。
注意,onCameraFrame是我们要具体去实现的接口, 而且也是我们处理图像主要战场
而我们也可以通过继承 deliverAndDrawFrame 这个方法来 通过opengl 加载bitmap纹理,显示图像到 opengl es绑定的surface上,。
深入一点, deliverAndDrawFrame 的参数 CvCameraViewFrame 怎么来的?
如果玩过 Android 摄像头的人都知道, 在initializeCamera 就是 打开摄像头和设置摄像头的地方,
显示摄像头也有两种方式:
1 通过 setPreviewDisplay(SurfaceHolder holder)
这种,一般与 SurfaceView搭配, 通过SurfaceView.getHolder()
2 通过 setPreviewTexture(SurfaceTexture surfaceTexture)
这种,一般与 OpenGL的 Surface搭配,根据 我的另一篇博客,
SurfaceView通过 Holder 可以得到Surface,而在Native层,通过ANativeWindow_fromSurface来获得本地的window窗口,
然后,通过于该window获取EGLDisplay连接,进而创建EGLSurface及EGLContext,
这样就与Opengl关联起来
而SurfaceTexture 是绑定了一个Texture, 因此,摄像头通过 EGLSurface将,数据写到Surface上,即这个Texture的buffer里面,
Opengl 通过其draw方法,显示出图像预览来。
Camera的 PreviewCallback接口:
PreviewCallback在 摄像头预览显示每一帧到Surface上时,会通过Copy一份,通过接口
public void onPreviewFrame(byte[] frame)来获得
其中, frame就是我们获取的图像数据, 在内存中按字节连续存放。获取的预览图像格式是yuv。
OpenCV 的mat矩阵:
Mat类能够接收 byte[]数组,
在initializeCamera的 方法里面, 创建了两个Mat矩阵,mFrameChain[0], mFrameChain[1]
这两个Mat矩阵的目的是, 交替存放 PreviewCallback回掉回来的byte[] yuv数据。
CvCameraViewFrame:
是一个 Interface,里面提供了 转rgba, 和 gray的接口,
在继承的实现的子类里,JavaCameraFrame 接受了三个参数:
Mat, width, height
其中, Mat接受, mFrameChain[0]或者mFrameChain[1]
而通过 JavaCameraFrame的 rgba, 和 gray可以将yuv 转换为rgb或者灰度图像。
与 我们实现算法的战场 onCameraFrame的关系:
上一步转换过来的 rgb或者灰度图像 传给 onCameraFrame,onCameraFrame处理后 给deiverAndDrawFrame 显示
如果用opengl ,如何实现,性能有哪些提高的猜想:
在获取数据方面:
opengl es:
通过SurfaceTexture拿到 texture纹理
opencv:
通过 onPreviewCallback 拿到 byte[]
以上, gl是 16ms以内, onPreviewCallback需要30ms以上
在算法处理上:
都在native层实现
opengl:
在shader可以并行处理,每一点像素,就像PC端cuda一样。如果处理
opencv:
Mat矩阵 需要两个for循环
但是算法上,opencv 大大优于 opengl的实现
opengl 实现会很复杂,具体问题具体以后再分析,这里只是稍微提下
0 0
- Opencv For Android: 如何显示摄像头预览
- 【Android】Opencv For Android: 如何显示摄像头预览
- OpenCV for Android 设置预览界面尺寸
- opencv 显示摄像头+fps
- 如何利用MFC及Opencv读入摄像头并显示画面
- opencv打开多个摄像头同时预览
- opencv 如何读取摄像头
- opencv 如何读取摄像头
- Android下摄像头预览数据
- android 调起摄像头预览
- OpenCV 获取摄像头并显示摄像头视频
- OpenCV 获取摄像头并显示摄像头视频
- OpenCV 获取摄像头并显示摄像头视频
- OpenCV 获取摄像头并显示摄像头视频
- Opencv调用摄像头,显示摄像头图像
- OpenCV 获取摄像头并显示摄像头视频
- OpenCV 获取摄像头并显示摄像头视频
- android opencv 前置摄像头
- codeforces 587C(树上的倍增算法)
- sqlcipher-jdbc编译
- 02_flink 流处理
- android MVVM 数据绑定初体验
- [群友反馈] 程序猿身上的缺点
- Opencv For Android: 如何显示摄像头预览
- NYOJ 1185 最大最小值 (线段树区间最值 水)
- Android开发懒人库 -- ButterKnife
- WEB服务器、应用程序服务器、HTTP服务器区别
- IPC—信号量
- 45.Oracle数据库SQL开发之 日期和时间的存储与处理——使用时间戳
- JS初体验(一)
- Android Studio如何更改icon图标
- [01]基本语法