Auto Image rotation by LabVIEW
ก่อนเริ่มต้นเขียนโปรแกรม ผู้เขียนลองนั่งคิดถึงวิธีการหมุนภาพตามการตัดสินใจของมนุษย์ โดยทั่วไปมนุษย์สามารถเห็นภาพแล้วบอกได้ทันทีว่า ภาพนั้นเอียง และสามารถปรับภาพเอียงให้ตรงได้ทันที่ เช่น คุณลองดูรูปที่ 1 แล้วหมุนรูปนั้นให้แนวการวางหนังสือขนานไปกับแนวแกน x คุณรู้ได้ในทันทีว่าควรหมุนภาพอย่างไร
เมื่อต้องมานั่งเขียนโปรแกรม ผู้เขียนคิดว่าทำไมเราถึงหมุนภาพไปทิศทางนั้น โดยเริ่มต้นจากการตั้งคำถาม
1. สิ่งใดที่ใช้ในการพิจารณาในการหมุนภาพ
ตอบ จุด A และ B
2. หมุนใบในทิศทางใด ตามเข็มหรือทวนเข็ม
ตอบ พิจารณาจากความชันระหว่างจุด A กับ B หรือใช้ตรีโกณมิติเข้ามาพิจารณา
3.หมุนไปเป็นมุมเท่าใด คำนวณไงดี
ตอบ พิจารณาจาก ระบบพิกัดฉาก ว่าจุดผลลัพธ์ของการหมุนอยู่ที่ใด ในตัวอย่างนี้คือตำแหน่ง A´ แล้วคำนวณหามุมการหมุนด้วยตรีโกณมิติ
จากการตั้งคำถามที่กล่าวไปก่อนหน้านี้ สรุปได้ว่า เราต้องค้นหาตำแหน่ง A และ B ในภาพให้ได้ก่อนแล้วสมมุติว่าเราต้องการหมุนจุด A ไปยังจุด A' ด้วยมุมเซต้า ซึ่งมุมเซต้าคำนวณได้โดยใช้ตรีโกณมิติ
ดังนั้นโปรแกรมหมุนภาพมีขั้นตอนการเขียนโปรแกรมดังต่อไปนี้
1. ภาพที่ผู้เขียนรับได้จากกล้องเป็นภาพ 12 bit เก็บอยู่ในตัวแปรภาพ 16 bit ดังนั้นผู้เขียนจำเป็นต้องแปลงภาพเป็นภาพขาวดำชนิด 8 bit ด้วย IMAQ Cast Image ก่อน เนื่องจาก IMAQ Match Pattern 4 รองรับภาพชนิด 8 bit (U8) เท่านั้น
2. ใช้ IMAQ Match Pattern 4 หาตำแหน่งภาพอ้างอิง (กากบาท) คำนวณหาระยะห่างระหว่างภาพกากบาท เพื่อหาตำแหน่ง A และ B (โปรแกรมในส่วนของการติดตามวัตถุ สามารถศึกษาได้จากตัวอย่างของ LabVIEW ชื่อ Pattern Matching (All).vi)
3. ข้อมูลตำแหน่งกากบาทที่พบในภาพเป็นข้อมูลตัวแปรอาร์เรย์ ตำแหน่งของกากบาทที่บันทึกในอาร์เรย์ (Index) มีการเปลี่ยนแปลงทุกครั้งที่ค้นหาภาพอ้างอิง วิธีการหาตำแหน่ง A และ B วิธีหนึ่งคือ กำหนดระยะห่างของกากบาท เช่น รูปที่ 4 (ก) กำหนดให้ตำแหน่งอ้างอิงมีระยะห่างระหว่างจุด A กับ C ห่างกันมากที่สุด ระยะห่างระหว่างจุด B กับ C น้อยสุด ถ้านำระยะห่างทั้งสามมาเรียงลำดับ ระยะห่างตรงกลาง คือระยะห่างระหว่างจุด A กับ C เป็นต้น
4. คำนวณหามุมการหมุนด้วยสมการ tanθ= y/x ด้วยกล่องคำสั่งในรูปที่ 5 (ค)
5. ดำเนินการหมุนภาพด้วยกล่องคำสั่ง IMAQ Rotate ดังรูปที่ 6
6. ผลการหมุนภาพแสดงดังรูปที่ 7
รูปที่ 1 แบบจำลองการตัดสินใจของมนุษย์ในการหมุนภาพ |
เมื่อต้องมานั่งเขียนโปรแกรม ผู้เขียนคิดว่าทำไมเราถึงหมุนภาพไปทิศทางนั้น โดยเริ่มต้นจากการตั้งคำถาม
1. สิ่งใดที่ใช้ในการพิจารณาในการหมุนภาพ
ตอบ จุด A และ B
2. หมุนใบในทิศทางใด ตามเข็มหรือทวนเข็ม
ตอบ พิจารณาจากความชันระหว่างจุด A กับ B หรือใช้ตรีโกณมิติเข้ามาพิจารณา
3.หมุนไปเป็นมุมเท่าใด คำนวณไงดี
ตอบ พิจารณาจาก ระบบพิกัดฉาก ว่าจุดผลลัพธ์ของการหมุนอยู่ที่ใด ในตัวอย่างนี้คือตำแหน่ง A´ แล้วคำนวณหามุมการหมุนด้วยตรีโกณมิติ
ดังนั้นโปรแกรมหมุนภาพมีขั้นตอนการเขียนโปรแกรมดังต่อไปนี้
1. ภาพที่ผู้เขียนรับได้จากกล้องเป็นภาพ 12 bit เก็บอยู่ในตัวแปรภาพ 16 bit ดังนั้นผู้เขียนจำเป็นต้องแปลงภาพเป็นภาพขาวดำชนิด 8 bit ด้วย IMAQ Cast Image ก่อน เนื่องจาก IMAQ Match Pattern 4 รองรับภาพชนิด 8 bit (U8) เท่านั้น
รูปที่ 2 การแปลงภาพ U16 เป็นภาพ U8 |
2. ใช้ IMAQ Match Pattern 4 หาตำแหน่งภาพอ้างอิง (กากบาท) คำนวณหาระยะห่างระหว่างภาพกากบาท เพื่อหาตำแหน่ง A และ B (โปรแกรมในส่วนของการติดตามวัตถุ สามารถศึกษาได้จากตัวอย่างของ LabVIEW ชื่อ Pattern Matching (All).vi)
รูปที่ 3 กล่องคำสั่งสำรหับค้นหาภาพอ้างอิง และคำนวณระยะห่างระหว่างจุดอ้างอิง |
3. ข้อมูลตำแหน่งกากบาทที่พบในภาพเป็นข้อมูลตัวแปรอาร์เรย์ ตำแหน่งของกากบาทที่บันทึกในอาร์เรย์ (Index) มีการเปลี่ยนแปลงทุกครั้งที่ค้นหาภาพอ้างอิง วิธีการหาตำแหน่ง A และ B วิธีหนึ่งคือ กำหนดระยะห่างของกากบาท เช่น รูปที่ 4 (ก) กำหนดให้ตำแหน่งอ้างอิงมีระยะห่างระหว่างจุด A กับ C ห่างกันมากที่สุด ระยะห่างระหว่างจุด B กับ C น้อยสุด ถ้านำระยะห่างทั้งสามมาเรียงลำดับ ระยะห่างตรงกลาง คือระยะห่างระหว่างจุด A กับ C เป็นต้น
รูปที่ 4 (ก) ภาพจำลองภาพที่รับได้จากกล้อง และ (ข) วิธีการหาตำแหน่ง A และ B |
4. คำนวณหามุมการหมุนด้วยสมการ tanθ= y/x ด้วยกล่องคำสั่งในรูปที่ 5 (ค)
รูปที่ 5 (ก) และ (ข) ภาพจำลองที่รับได้จากกล้อง เมื่อภาพ (ก) เป็นกรณีที่หมุนภาพแบบทวนเข็ม ส่วน (ข) เป็นกรณีที่หมุนภาพแบบตามเข็ม และ (ค) เป้็นกล่องคำสั่งในการคำนวนการหมุนภาพ |
5. ดำเนินการหมุนภาพด้วยกล่องคำสั่ง IMAQ Rotate ดังรูปที่ 6
รูปที่ 6 ตัวอย่างกล่องคำสั่งหมุนภาพ |
6. ผลการหมุนภาพแสดงดังรูปที่ 7
รูปที่ 7 (ก) ภาพที่รับได้จากกล้อง และ (ข) ภาพที่ผ่านการหมุนด้วยโปรแกรมที่พัฒนาขึ้น |