| 
 | 
 
 本帖最后由 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] 
 
 |   
 
 
 
 |