程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Kinect V2 基礎教程之彩色圖像,

Kinect V2 基礎教程之彩色圖像,

編輯:C#入門知識

Kinect V2 基礎教程之彩色圖像,


  本程序為自己所寫,參考素材包括微軟官方例子和外文資料,自己做了部分的優化。解釋的如果有問題,懇請大家指正.

後台代碼:

using System.ComponentModel;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Kinect;

namespace KinectV2
{
    /// <summary>
    /// MainWindow.xaml 
    /// </summary>
    public partial class MainWindow : Window
    {
        #region 定義變量

        // kinect設備
        KinectSensor kinect;

        //彩色幀讀取
        ColorFrameReader colorFrameReader;

        //一幀圖像的性質描述
        FrameDescription colorFrameDesc;

        //枚舉類型,定義彩色幀的格式(共6種)
        //此處規定彩色幀格式為Bgra格式:4字節存儲一個像素點,包含blue,green,red,alpha(即像素點亮度值)
        ColorImageFormat colorFormat = ColorImageFormat.Bgra;

        //創建用於顯示圖像的位圖
        WriteableBitmap colorBitmap;

        //用於存放一幀彩色圖像的所有信息(byte 類型,每個元素占一個字節) 
        byte[] colorBuffer;

        //一幀彩色圖像的步長(物理意義:此處表示一幀圖像的每一行需占用的字節個數)(作用:渲染位圖時需要提供圖像的步長)
        int colorStride;

        //存放彩色圖像的矩形畫布(作用:渲染位圖時需要提供畫布位置和大小)
        Int32Rect colorRect;

        #endregion


        public MainWindow()
        {
            InitializeComponent();

            #region 變量初始化、賦值

            // 獲取默認的kinect傳感器
            kinect = KinectSensor.GetDefault();

            //啟動傳感器
            kinect.Open();

            //確定彩色幀的數據類型
            colorFrameDesc = kinect.ColorFrameSource.CreateFrameDescription(colorFormat);

            // 創建並返回一個新的讀取對象
            colorFrameReader = kinect.ColorFrameSource.OpenReader();

            //觸發彩色幀事件
            colorFrameReader.FrameArrived += colorFrameReader_FrameArrived;

            //彩色位圖初始化(96,96表示分辨率,即96像素/英寸)
            colorBitmap = new WriteableBitmap(colorFrameDesc.Width, colorFrameDesc.Height, 96, 96, PixelFormats.Bgra32, null);

            //圖像步長初始化
            colorStride = colorFrameDesc.Width * (int)colorFrameDesc.BytesPerPixel;//(int)colorFrameDesc.BytesPerPixel = 4,每個像素點占4字節

            //畫布矩形框初始化
            colorRect = new Int32Rect(0, 0, colorFrameDesc.Width, colorFrameDesc.Height);

            //計算總共需要多少個字節才能儲存一幀圖像的所有像素點
            colorBuffer = new byte[colorStride * colorFrameDesc.Height];

            //彩色位圖和UI界面圖片控件關聯
            ImageColor.Source = colorBitmap;    //即實時的將獲取的彩色幀信息描繪在ImageColor控件中

            #endregion
        }

        #region 處理來自傳感器的彩色幀 事件

        //彩色幀觸發事件
        void colorFrameReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e)
        {
            //更新彩色幀,然後描繪彩色幀
            UpdateColorFrame(e);
            DrawColorFrame();
        }

        private void UpdateColorFrame(ColorFrameArrivedEventArgs e)
        {
            // 獲取一幀彩色圖像
            using (var colorFrame = e.FrameReference.AcquireFrame())
            {
                if (colorFrame == null)
                {
                    return;
                }
                // 將一幀彩色圖像數據以‘colorFormat’格式拷貝放到‘colorBuffer’中
                colorFrame.CopyConvertedFrameDataToArray(colorBuffer, colorFormat);
            }
        }

        private void DrawColorFrame()
        {
            // 將獲取的一幀彩色圖像數據更新到位圖中
            colorBitmap.WritePixels(colorRect, colorBuffer, colorStride, 0);
        }
        #endregion



        //程序窗口關閉事件
        private void Window_Closing(object sender, CancelEventArgs e)
        {
            // 釋放彩色幀資源
            if (colorFrameReader != null)
            {
                colorFrameReader.Dispose();
                colorFrameReader = null;
            }
            //關閉kinect傳感器
            if (kinect != null)
            {
                kinect.Close();
                kinect = null;
            }
        }

    }
}

XAML界面代碼:

<Window x:Class="KinectV2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Closing="Window_Closing" >
    <Grid Width="512" Height="424">
        <Image x:Name="ImageDepth"  />
    </Grid>
</Window>

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved