Monday, April 13, 2015

การตรวจสอบความผิดพลาดจากการเชื่อมต่อกับ Kinect

ตอนที่แล้วเราได้ลองเขียนโปรแกรมเพื่อเชื่อมต่อกับ Kinect แล้วดึงภาพจากกล้องมาแสดงผล

จะเกิดอะไรขึ้นถ้า Kinect ไม่ได้ต่ออยู่ หรือแม้ว่าต่ออยู่ แต่ไม่สามารถเชื่อมต่อได้

แน่นอนว่าโปรแกรมก็จะผิดพลาดแล้วจบไปแบบไม่สวย ทำอย่างไรให้โปรแกรมแจ้งเตือนแล้วค่อยปิดไปแบบนี้

ลองมาเขียนโค้ดตรวจสอบข้อผิดพลาดในการเชื่อมต่อเหล่านี้กันดีกว่าครับ โดยฟังก์ชันที่ต้องไปแก้ไข ก็คือ Window_Loaded() ที่จะถูกเรียกเมื่อหน้าต่างของโปรแกรมถูกสร้างขึ้น

ความผิดพลาดจากการเชื่อมต่อ ตามตำราบอกไว้ว่าอาจเกิดได้สองกรณี คือ
1. ไม่ได้ต่อ Kinect หรือการเชื่อมต่อไม่สมบูรณ์ (เช่นยังไม่ได้ติดตั้ง driver)
อันนี้เราสามารถเช็คได้โดยใช้คำสั่ง KinectSensor.KinectSensors.Count ซึ่งจะบอกว่าตอนนี้มี Kinect ต่อกับคอมของเรากี่อัน (สูงสุดได้ 4 อัน) ถ้าได้ค่า 0 แสดงว่าไม่มี Kinect ต่ออยู่เลย

2. เชื่อมต่อ Kinect ได้ แต่ไม่สามารถเรียกใช้งานได้ ซึ่งอาจเกิดจาก มีแอพอื่นใช้กล้องอยู่ หรือ memory ไม่พอ เป็นต้น
สามารถตรวจสอบได้โดยใช้ try...catch ครอบคำสั่งที่ลองติดต่อ Kinect ได้แก่ KinectSensor.KinectSensors[0] และ myKinect.Start() เป็นต้น

เรามาลองตรวจจับเหตุการณ์ข้างต้น โดยการแก้ไขเฉพาะฟังก์ชัน Window_Loaded() ดังนี้ครับ

        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            //Check if there is any connecting Kinect
            if (KinectSensor.KinectSensors.Count == 0)
            {
                MessageBox.Show("No Kinect detected!", "Error");
                //end this app
                Application.Current.Shutdown();
            }

            //Try to initialize Kinect
            try
            {
                //Get the first Kinect connected to this computer
                myKinect = KinectSensor.KinectSensors[0];
                //Enable the color video stream
                myKinect.ColorStream.Enable();
                //Start the sensor
                myKinect.Start();
            }
            catch
            {
                MessageBox.Show("Initialize Kinect failed!", "Error");
                //end this app
                Application.Current.Shutdown();
            }

            //Video event handler
            myKinect.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(myKinect_ColorFrameReady);           
        }

No comments:

Post a Comment