- ในช่วงเริ่มต้นของโปรแกรมจะทำการสร้างตัวแปรสำหรับใช้ในการตรวจจับคือ
- blobs สำหรับใช้เก็บ object ของ class ในการคำนวณหาผลลัพธ์
- blobs_buffer สำหรับเก็บ blobs เป็น Array ขนาด [ [] , [] , [] ]
- old_id สำหรับเก็บ id ของข้อมูลที่เข้ามาเป็น Array ขนาด [ [] , [] , [] ]
- โดยทุกครั้งที่มีการเรียกฟังค์ชัน blobs จะถูก reset ให้เป็น Array [] เสมอ
- ทำการ Update old id ทุกครั้งที่ โดยจะทำการ reset array ก่อนนำ id ใน blobs_buffer มาใส่ค่าแทนที่ลงไป
- จากนั้นจะทำการไปดึงข้อมูล contour ของภาพมาผ่านฟังค์ชัน get_contours โดยส่งค่าขนาดความจอในแนวแกน x และ y ไปเพื่อทำ Image Processing โดยผลที่ได้กลับมาจะเป็น Array ของข้อมูล contour ที่ตัด threshold และอื่นๆเรียบร้อย ในลักษณะ
Array[ [ [[ x y ]] [[ x y ]] [[ x y ]] .. [[ x y ]] ] ] โดย x และ y array คือ ตำแหน่งของ contour แต่ละจุดรวมๆกัน
ส่วนที่ 2 การทำ BlobAnalysis และ blob_track
- จากนั้นจะทำการเรียก class BlobAnalysis มาเก็บไว้ในตัวแปร blob โดยจะส่งข้อมูล contour ไปทำการปรับรูปแบบของข้อมูลและคำนวณหาจุดศูนย์กลางของ contour หรือ centroid รวมไปถึงส่วนบกพร่องการนูนหรือ convexity deflect เพื่อใช้ตรวจสอบร่องมือและตรวจจับว่าเป็นมือหรือไม่
- จากนั้นจะนำ blob มาทำ blobs_track โดยการทำงานคร่าวๆคือ จะทำการตรวจสอบก่อนว่า blob ที่ได้มาใหม่นั้นเหมือนกับ blob จาก blobs_buffer เก่าหรือไม่ จากนั้นจะทำการบันทึกค่า id ใหม่ให้กับ blob ที่เป็น class object , ตรวจสอบว่า blob นั้นเป็นมือหรือไม่จากข้อมูลใน object และทำการบันทึกค่า centroid 2 ชุด ลงใน blobs_movement จากนั้นจึง return blob ไปเก็บในตัวเอง
- เพิ่ม blob ลงไปใน array blobs และนำ blobs ไปบันทึกลงใน array blobs_buffer ซึ่งข้อมูลใน array ทั้ง 3 ตัวจะมีค่าเหมือนกันทั้งหมด
ส่วนที่ 3 การ check_gesture
- ทำการรับค่า fps และดึงค่า blobs และ blobs_movement มาใช้ด้วย และนำไปเช็คว่า blobs นั้นเป็นมือหรือไม่ หากใช่จะทำการนำ fps มากำหนด frame สำหรับสร้างตัวแปร vector ที่ใช้เก็บข้อมูล centroid ทั้งหมด 20 จุดจาก blobs_movement
- นำ vector มาคำนวณหาองศาการเคลื่อนที่และระยะห่างของ centroid ทีละ 2 จุด หากระยะห่างของ centroid ทั้ง 2 มากกว่า 8 เซนติเมตร จะทำการนำองศาที่คำนวณไปเข้าเงื่อนไขหาว่าเคลื่อนที่ไปทางไหนแหละให้ weight แก่ทิศทางนั้นๆ
- เมื่อครบจะนำ weight ของทิศที่มีค่าสูงสุดไปตรวจสอบว่ามีค่ามากกว่า 70% ของการเคลื่อนที่ทั้งหมดใน frame หรือไม่ หากใช่จะทิศการเคลื่อนที่นั้นไปสำหรับ mapping กับ keyboard
จากนั้นจะทำการวน loop ไปเรื่อยๆเพื่อตรวจสอบท่าทาง
ไม่มีความคิดเห็น:
แสดงความคิดเห็น