Android相机API2,基于GLSurfaceView+SurfaceTexture实现相机预览,集成的相机算法采用GPU方案,简要说明

Android相机API2,基于GLSurfaceView+SurfaceTexture实现相机预览,集成的相机算法采用GPU方案,简要流程如下(不叠加相机算法的预览显示流程也大体如此,只是去掉了算法部分):

进入相机:

1,新建实现了GLSurfaceView.Renderer接口的自定义类CameraRenderer,初始化GLSurfaceView,将两者绑定在一起,GLSurfaceView作为View组件来显示相机预览;

相机启动:

1,在起预览配流时,创建SurfaceTexture,用它来接收相机预览数据;

OpenGL初始化:

1,在Surface创建时会触发回调CameraRenderer.onSurfaceCreated,在里面获取当前的GLSurfaceView的EGLContext,并将其传递给相机算法,使得允许相机算法和GLSurfaceView共享GPU资源;

循环渲染:

1,当有预览帧来时,触发回调SurfaceTexture.OnFrameAvailable,在里面调用glSurfaceView.requestRender进行重绘;

2,glSurfaceView.requestRender中释放锁唤醒GLThread的线程执行,里面循环检查是否需要进行绘制,需要的话就调CameraRenderer.onDrawFrame;

3,onDrawFrame中调surfaceTexture.updateTexImage,将最新的相机预览帧数据更新到SurfaceTexture内部的纹理中;

4,调算法处理接口,输入纹理ID,输出也是纹理ID;

5,将这个纹理ID作为数据源,绘制到GLSurfaceView上,至此预览完成这一帧显示;后续重复"循环渲染"的步骤;

总结:

1,创建GLSurfaceView,这个作为View组件显示相机预览;

2,在相机起预览配流时,创建SurfaceTexture,用来接收相机预览数据;

3,OpenGL要初始化;

4,最后就是循环绘制的流程,当有预览帧来时,触发回调SurfaceTexture.OnFrameAvailable,在里面触发重绘,更新最新预览数据到SurfaceTexture内部纹理中,将纹理ID输入算法进行处理,算法处理后输出更新后的纹理ID,最后将这个纹理ID作为数据源绘制到GLSurfaceView上;

UML类图如下。

相关推荐
在世修行6 小时前
从零打造 C# 工业视觉检测系统(五):相机连接、连续取流与双路实时预览
数码相机·c#·视觉检测
格林威19 小时前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
xcLeigh1 天前
Unity基础:Camera相机组件详解——透视投影与正交投影的区别
数码相机·unity·游戏引擎
在世修行1 天前
从零打造 C# 工业视觉检测系统(四):海康威视 MVS SDK 入门与相机枚举实战
数码相机·c#·视觉检测
m0_749492221 天前
2026平价运动相机选择指南:科美锐(Komery)PX3与另外两款相机的功能取舍拆解
数码相机
沐梯子1 天前
AI视频工具大战升级!PixPix首发接入MiniMaxH3大战Seedance
数码相机
c#上位机1 天前
线扫相机的帧触发
数码相机
深视智能科技1 天前
PIV高速成像系统如何同步?相机、激光与数据传输配置指南
数码相机
c#上位机2 天前
线扫相机的工作原理
数码相机
c#上位机2 天前
线扫相机之采集图像高度
数码相机·opencv·计算机视觉