|  | 
 
| 本帖最后由 ycyipman 于 2016-2-16 14:09 编辑 
 一、使用方式:
 红外线帧获取需要两个脚本,InfraredSourceManager和InfraredSourceView,使用时新建一个空物体,并为其添加InfraredSourceManager,在新建一个plane或者cube,添加InfraredSourceView作为输出展示载体。InfraredSourceView需要一个公共变量,将InfraredSourceManager所在的空物体拖入即可。
 二、脚本执行过程:
 InfraredSourceManager脚本:
 过程大致与彩色帧一致,唯一一个不同的地方在于frameDesc对象的得到的_Data数据需要再做一次转换,由于从Kinect直接得到的数据为一个16位无符号整数,这个整数直接代表了这个点的灰度值。而这16位整数只有高10位为有效值,但是能够显示10位灰度值的显示器不多,因此大多数情况下只需要取高8位即可,即16位整数向右移动8位作为最后的灰度值结果。然后,将该值赋予对应的点的RGB三个值,alpha通道则固定位255.具体代码表示如下:
 [mw_shl_code=csharp,true]    void Update()
 {
 if (_Reader != null)
 {
 var frame = _Reader.AcquireLatestFrame();
 if (frame != null)
 {
 frame.CopyFrameDataToArray(_Data);
 
 int index = 0;
 foreach (var ir in _Data)
 {
 //intensity代表每一个点的灰度值
 //从Kinect获得的红外红外数据是一个16位无符号整数,这个整数直接代表了这个点的灰度值。
 //这16位只有高10位是有效的,10位灰度,只有高级显示器才能显示,
 //我们这一般的显示只能显示256级即8位灰度,所以我们应该舍弃其中2位。舍弃的是最低的两位
 byte intensity = (byte)(ir >> 8);
 //RGB相同时,颜色都在灰阶上
 _RawData[index++] = intensity;//R
 _RawData[index++] = intensity;//G
 _RawData[index++] = intensity;//B
 _RawData[index++] = 255; // Alpha
 }
 
 _Texture.LoadRawTextureData(_RawData);
 _Texture.Apply();
 
 frame.Dispose();
 frame = null;
 }
 }
 }
 [/mw_shl_code]
 
 由于_RawData数组中每四个值代表一个点,因此在Start函数中_RawData数组长度应为_Data数组的4倍,即:
 [mw_shl_code=csharp,true]    void Start()
 {
 _Sensor = KinectSensor.GetDefault();
 if (_Sensor != null)
 {
 _Reader = _Sensor.InfraredFrameSource.OpenReader();
 var frameDesc = _Sensor.InfraredFrameSource.FrameDescription;
 _Data = new ushort[frameDesc.LengthInPixels];
 //_RawData里的元素排列顺序为R/G/B/Alpha,每四位代表一个点的灰度值,因此长度为_Data长度的4倍
 _RawData = new byte[frameDesc.LengthInPixels * 4];
 _Texture = new Texture2D(frameDesc.Width, frameDesc.Height, TextureFormat.BGRA32, false);
 
 if (!_Sensor.IsOpen)
 {
 _Sensor.Open();
 }
 }
 }
 [/mw_shl_code]
 
 除此之外,再建立两个函数,一个用于向InfraredSourceView脚本提供最后的结果,另一个执行应用程序关闭后的操作,此处与彩色帧相同:
 [mw_shl_code=csharp,true]    public Texture2D GetInfraredTexture()
 {
 return _Texture;
 }
 
 void OnApplicationQuit()
 {
 if (_Reader != null)
 {
 _Reader.Dispose();
 _Reader = null;
 }
 
 if (_Sensor != null)
 {
 if (_Sensor.IsOpen)
 {
 _Sensor.Close();
 }
 
 _Sensor = null;
 }
 }
 [/mw_shl_code]
 
 
 | 
 |