Sunday, April 12, 2015

การอ่านและแสดงผลภาพจาก Kinect

ลองมาเขียนโค้ดเชื่อมต่อกับ Kinect เพื่อแสดงผลวิดีโอจากกล้อง ประมาณรูปด้านล่างกันครับ

อันดับแรก เปิด Visual Studio ก่อน เปิดกล้องและเสียบเชื่อมต่อกับพอร์ต USB ให้เรียบร้อย

สร้างโปรเจคใหม่ของ C# สมมติว่าใช้ชื่อว่า KinectCam

ลองสังเกตดูแถบ Solution Explorer ซึ่งอาจจะอยู่ทางด้านขวามือ คลิกขวาที่ References แล้วเลือก Add Reference


เลือกหัวข้อ Browse แล้วเลือกปุ่ม Browse... ด้านล่างเพื่อหาไฟล์ Microsoft.Kinect.dll ซึ่งจะอยู่ที่ C:\Program Files\Microsoft SDKs\Kinect\v1.8\Assemblies ถ้าติดตั้งตามปกติ จะได้ผลลัพธ์ดังภาพ

ที่ Solution explorer ดับเบิลคลิกที่ MainWindow.xaml.cs เพื่อจะเขียนโค้ด

ที่ Solution explorer ดับเบิลคลิกที่ MainWindow.xaml เพื่อจะแก้ไข หน้านี้จะเป็น Interface หลักของโปรแกรม

ให้เพิ่มแท็กชื่อ Image เพื่อจะแสดงวิดีโอจาก Kinect ลงบนหน้าต่างดังนี้

"< Image Name="kinectVideo" Width="640" Height="480" />"

ต่อไป ให้ทำการคลิกบริเวณโค้ดที่เขียนว่า "< Window x:Class=... " จากนั้นก็เลื่อนไปดูทางขวามือ ในส่วนของแถบ Properties ให้คลิกสัญลักษณ์ที่เป็นเหมือนสายฟ้า แล้วเลื่อนหา Event ชื่อ Loaded จากนั้นก็ดับเบิลคลิกในช่องว่างที่อยู่ถัดจาก Event Loaded นี้ มันก็จะเกิด Method ใหม่ขึ้นมาชื่อ Window_Loaded_1 โดยอัตโนมัติในไฟล์โค้ด MainWindow.xaml.cs ในที่นี้ ผมเปลี่ยนให้เป็นชื่อ Window_Loaded ทั้งในส่วนของการออกแบบ และส่วนโค้ด




จากนั้น เราก็จะทำการเพิ่มโค้ดต่างๆ ดังนี้

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Kinect;

namespace KinectCam
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        KinectSensor myKinect;
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //Get the first Kinect connected to this computer
            myKinect = KinectSensor.KinectSensors[0];
            //Enable the color video stream
            myKinect.ColorStream.Enable();
            //Video event handler
            myKinect.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(myKinect_ColorFrameReady);
            //Start the sensor
            myKinect.Start();
        }

        void myKinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
        {
            using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
            {
                //if get new video frame
                if (colorFrame == null)
                    return;
                //create an array of pixel data
                byte[] colorData = new byte[colorFrame.PixelDataLength];
                //extract pixel data from the frame to the array
                colorFrame.CopyPixelDataTo(colorData);
                //create a bitmap from the video array and set it to Image UI
                kinectVideo.Source = BitmapSource.Create(
                    colorFrame.Width, colorFrame.Height,    //image dimension
                    96, 96,                 //resolution 96 dpi for video frames
                    PixelFormats.Bgr32,     //image format
                    null,                   //palette - none
                    colorData,              //video data
                    colorFrame.Width * colorFrame.BytesPerPixel     //stride
                    );
            }
        }
    }
}
แล้วลองรันโปรแกรมดูครับ น่าจะเห็นหน้าต่างแสดงผลภาพวิดีโอจาก Kinect แล้วล่ะครับ

1 comment:

  1. อยากเรียนถามอาจารย์ว่า
    การเขียนโปรแกรมกับกล้อง Kinect มันจะแตกต่างอย่างกับการเรียนโปรแกรมกับกล้องอื่นๆเช่น Webcam ครับ และโปแกรมที่เขียนกับ Kinect มันจะมีความพิเศษกว่าที่เขียนกับ Web cam อย่างไรบ้างครับ

    ขอบคุณครับ

    ReplyDelete