Auto Image rotation by LabVIEW

     ก่อนเริ่มต้นเขียนโปรแกรม ผู้เขียนลองนั่งคิดถึงวิธีการหมุนภาพตามการตัดสินใจของมนุษย์ โดยทั่วไปมนุษย์สามารถเห็นภาพแล้วบอกได้ทันทีว่า ภาพนั้นเอียง และสามารถปรับภาพเอียงให้ตรงได้ทันที่ เช่น คุณลองดูรูปที่ 1 แล้วหมุนรูปนั้นให้แนวการวางหนังสือขนานไปกับแนวแกน x คุณรู้ได้ในทันทีว่าควรหมุนภาพอย่างไร

รูปที่ 1 แบบจำลองการตัดสินใจของมนุษย์ในการหมุนภาพ

เมื่อต้องมานั่งเขียนโปรแกรม ผู้เขียนคิดว่าทำไมเราถึงหมุนภาพไปทิศทางนั้น โดยเริ่มต้นจากการตั้งคำถาม

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 การแปลงภาพ 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 (ก) ภาพที่รับได้จากกล้อง และ (ข) ภาพที่ผ่านการหมุนด้วยโปรแกรมที่พัฒนาขึ้น

โพสต์ยอดนิยมจากบล็อกนี้

สร้างข้อมูลเส้นตรงด้วย Ramp Pattern.VI (LabVIEW)

วิธีการวางไฟล์ PDF ที่อยู่ใน Google Drive ใน Blogger