Appearance
如何使用 RGB 相机
说明
允许创建多个 NormalRGBCameraDevice 对象,并重复打开 RGB 相机,但使用结束要主动执行关闭,否则系统会持续保持 RGB 相机打开状态。
多个 NormalRGBCameraDevice 对象,实际使用都是同一个物理 RGB 相机,但需要关注使用周期的完整性。
例如,第一个 RGB 相机功能'Func1'使用中,打开第二个功能'Func2',Func1 在 Func2 使用中结束的时候,需要执行相机的关闭,此时不影响 Func2 继续使用 RGB 功能,直到 Func2 也执行了相机的关闭,此时 RGB 相机才会真正关闭。
打开、关闭相机
获取相机参数
获取尺寸,和内参,是不需要 Open RGB 相机的,可以通过 getCameraSize()和 getRGBCameraIntrics()直接获取。
csharp
NormalRGBCameraDevice rgbCameraDevice = new NormalRGBCameraDevice();
//获取尺寸
int[] sizeRgbCamera = rgbCameraDevice.getCameraSize();
_imageWidth = sizeRgbCamera[0];
_imageHeight = sizeRgbCamera[1];
//获取内参,[fx,fy,cx,cy,k1,k2,p1,p2]
float[] intrinsic = new float[8];
rgbCameraDevice.getRGBCameraIntrics(intrinsic);
打开和关闭
调用 open(),系统就会打开 RGB 相机了,直到调用 close(),且已经没有其他程序在使用 RGB,系统才会关闭 RGB 相机。
csharp
NormalRGBCameraDevice rgbCameraDevice = new NormalRGBCameraDevice();
rgbCameraDevice.Open();
......
rgbCameraDevice.Close();
获取图像数据
在 Open 之后,就可以获取相机数据了,默认格式是 YUV_420_888/NV_21 格式。
也可以通过指定格式获取图像,仅接受 RGBA 和 YUV420A 两种格式,并且 RGBA 会有额外的格式转化开销,一般不推荐直接使用。
csharp
camImageBuffer = new EZVIOInputImage();
float[] cameraIntrinsics = new float[8]
rgbCameraDevice.getCurrentImage(ref camImageBuffer , cameraIntrinsics);
//或者指定格式
rgbCameraDevice.getCurrentImage(ref camImageBuffer , cameraIntrinsics, EZVIOImageFormat.EZVIOImageFormat_RGBA);
绘制 RGB 图像
开发者可以自己获取图像后绘制,也可以使用 SDK 提供的接口直接绘制成纹理,然后使用纹理绘制到相关的物体上。
获取数据自行绘制
提供 SDK 自带的一个 shader 来直接绘制纹理的方式,推荐此方式,相对效率更高
csharp
//创建材质和shader
_videoBackgroundMat = new Material(Shader.Find("EZXR/YUV2RGB"));
int[] imageSize = rgbCameraDevice.getCameraSize();
m_VideoTexture_Y = new Texture2D(imageSize[0], imageSize[1], TextureFormat.R8, false);
m_VideoTexture_UV = new Texture2D(imageSize[0] / 2, imageSize[1] / 2, TextureFormat.RG16, false);
_videoBackgroundMat.SetTexture("_YTex", m_VideoTexture_Y);
_videoBackgroundMat.SetTexture("_UVTex", m_VideoTexture_UV);
_videoBackgroundMat.SetFloat("_TexWidth", previewSize[0]);
_videoBackgroundMat.SetFloat("_TexHeight", previewSize[1]);
//更新图像数据
rgbCameraDevice.getCurrentImage(ref m_CamImageBuffer, m_cameraIntrinsics);
m_VideoTexture_Y.LoadRawTextureData(m_CamImageBuffer.fullImg, previewSize[0] * previewSize[1]);
m_VideoTexture_Y.Apply();
m_VideoTexture_UV.LoadRawTextureData(m_CamImageBuffer.fullImg + previewSize[0] * previewSize[1], previewSize[0] * previewSize[1] / 2);
m_VideoTexture_UV.Apply();
也可以直接获取绘制好的纹理。也有两种方式,一种是使用 Unity 创建的纹理,一种是使用 rgbCameraDevice 创建的纹理,这两种没有效率差别。
csharp
//纹理由Native生成,再转化为unity Texture2D
rgbCameraDevice.DrawRGBVideoFrame();
m_VideoTexture = Texture2D.CreateExternalTexture(rgbCameraDevice.GetRGBVideoTexture());
//Unity负责刷新纹理即可
m_VideoTexture.UpdateExternalTexture((IntPtr)rgbCameraDevice.GetRGBVideoTexture());
json
//由Unity 创建纹理,然后获得其NativePtr
m_VideoTexture = new Texture2D(screenWidth, screenHeight, TextureFormat.RGBA32, false);
IntPtr texturePtr = m_VideoTexture.GetNativeTexturePtr();
//传给相机更新背景
rgbCameraDevice.DrawRGBVideoFrame(texturePtr);