|
一、使用方式:
彩色帧获取需要两个脚本,ColorSourceManager和ColorSourceView,使用时新建一个空物体,并为其添加ColorSourceManager,在新建一个plane或者cube,添加ColorSourceView作为输出展示载体。ColorSourceView需要一个公共变量,将ColorSourceManager所在的空物体拖入即可。
二、脚本执行过程:
ColorSourceManager脚本:
该脚本成员变量及含义如下:
[mw_shl_code=csharp,true]public int ColorWidth { get; private set; } //彩色帧宽度
public int ColorHeight { get; private set; } //彩色帧高度
private KinectSensor _Sensor; //传感器对象
private ColorFrameReader _Reader; //彩色帧阅读器对象
private Texture2D _Texture; //纹理对象
private byte[] _Data; //LoadRawTextureData的参数,用于临时存储彩色帧数据[/mw_shl_code]
脚本拥有一个公共接口,用于返回脚本的_Texture,该变量包含了需要ColorSourceView输出的纹理
[mw_shl_code=csharp,true]/// <summary>
/// 公共接口,用于向ColorSourceView返回ColorSourceManager获得的Texture2D对象
/// </summary>
/// <returns>ColorSourceManager获得的Texture2D对象</returns>
public Texture2D GetColorTexture()
{
return _Texture;
}
[/mw_shl_code]
脚本Start函数用于读取数据工作的初始化,具体执行过程如下:
[mw_shl_code=csharp,true] void Start()
{
//获得默认的传感器对象
_Sensor = KinectSensor.GetDefault();
if (_Sensor != null)
{
//打开彩色帧阅读器对象
_Reader = _Sensor.ColorFrameSource.OpenReader();
//创建FrameDescription对象,对象中包含彩色帧的宽度高度等信息
var frameDesc = _Sensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Rgba);
ColorWidth = frameDesc.Width;//1920
ColorHeight = frameDesc.Height;//1080
//根据彩色帧高度宽度等值创建纹理对象
_Texture = new Texture2D(frameDesc.Width, frameDesc.Height, TextureFormat.RGBA32, false);
//FrameDescription对象中包含每一个像素的byte值和总共的像素值,相乘得到总的byte值作为数据区的长度,在LoadRawTextureData函数中使用
_Data = new byte[frameDesc.BytesPerPixel * frameDesc.LengthInPixels];
//打开传感器
if (!_Sensor.IsOpen)
{
_Sensor.Open();
}
}[/mw_shl_code]
脚本在Update函数中获取有效帧,再从有效帧中得到彩色帧数据,放进_Data中,通过LoadRawTextureData函数得到纹理,具体代码解释如下:
[mw_shl_code=csharp,true] void Update ()
{
if (_Reader != null)
{
//这个称为轮询模式,有空的时候来问一下Kinect有没有新的彩色帧,这个模式适合游戏
var frame = _Reader.AcquireLatestFrame();
if (frame != null)
{
//调用ColorFrame中的CopyConvertedFrameDataToArray,将转换之后的彩色帧数据放进_Data数据区
frame.CopyConvertedFrameDataToArray(_Data, ColorImageFormat.Rgba);
//根据_Data数据区中的数据内容加载纹理对象
_Texture.LoadRawTextureData(_Data);
//应用更改过的纹理数据
_Texture.Apply();
//释放并关闭帧数据
frame.Dispose();
frame = null;
}
}
}[/mw_shl_code]
最后,在引用程序退出时,释放资源,关闭对象:
[mw_shl_code=csharp,true] /// <summary>
/// 在应用程序退出的时候,该释放的释放,该关闭的关闭
/// </summary>
void OnApplicationQuit()
{
if (_Reader != null)
{
_Reader.Dispose();
_Reader = null;
}
if (_Sensor != null)
{
if (_Sensor.IsOpen)
{
_Sensor.Close();
}
_Sensor = null;
}
}
[/mw_shl_code]
ColorSourceView脚本:
该脚本的成员变量即为ColorSourceManager对象:
[mw_shl_code=csharp,true]public GameObject ColorSourceManager;
private ColorSourceManager _ColorManager;[/mw_shl_code]
Start函数设置初始纹理大小:
[mw_shl_code=csharp,true] void Start ()
{
//初始设置纹理大小
gameObject.GetComponent<Renderer>().material.SetTextureScale("_MainTex", new Vector2(-1, 1));
}[/mw_shl_code]
Update函数实时调用ColorSourceManager中的GetColorTexture函数,用于得到纹理数据,再将它显示出来,其余则是防御性代码:
[mw_shl_code=csharp,true] void Update()
{
if (ColorSourceManager == null)
{
return;
}
_ColorManager = ColorSourceManager.GetComponent<ColorSourceManager>();
if (_ColorManager == null)
{
return;
}
//调用ColorSourceManager中的GetColorTexture函数,将返回的纹理对象赋值给ColorSourceView对象的纹理属性
gameObject.GetComponent<Renderer>().material.mainTexture = _ColorManager.GetColorTexture();
}[/mw_shl_code] |
|