เริ่มต้นอ่าน Android ของพี่หนึ่ง ที่ Android
และได้อ่าน Paper ของ Paul Heckbert ในหนังสือ Fundamental of Texture Mapping and Image Wraping โหลดได้ ที่นี่
จึงค้นพบวิธี Wrap อีกวิธีหนึ่งซึ่งเร็วกว่าซึ่งจะมาดูว่าเร็วกว่าอย่างไร
การ Wrap จาก Quadrilateral to Quadrilateral แบ่งเป็น 2 แบบ
1. การแปลงแบบ Case 3 คือ แปลงจาก Quadrilateral to Quadrilateral โดยตรง
จะใช้ สมการ 8 สมการ เพื่อหา Unknown 8 ตัว a-h
สำหรับ map จุด (u,v) ใน Quadrilateral ต้นทางไปยัง จุด(x,y) ใน Quadrilateral ปลายทาง
โค๊ดตัวอย่างใน matlab
2. ทำ Case 2 แล้วตามด้วยการทำ Case 1
ซึ่งสูตรได้มาจากการแก้สมการเพื่อหา Case 1 ซึ่งเป็น Unit Square to Quadrilateral โดยเริ่มหามาจาก
สมการในรูปทั่วไป Quadrilateral to Quadrilateral แบบ 8x8 symtem
นำมาแทนค่าในสมการด้วยค่าดังนี้
จะได้ 8 สมการดังนี้
จากใน Paper เค้าบอกว่า สามารถคำนวณเป็น Close Form ได้เลย
หากแทนเพิ่ม พจน์
จะได้ Close Form ดังนี้
ซึ่งทำให้คำนวน a-h พารามิเตอร์ของ case 1 ได้ วิธีนี้มีข้อดีที่ใช้เวลาในการคำนวนน้อยกว่าแบบแรกมาก
โค๊ดตัวอย่าง case 1 ใน matlab
ต่อจากนั้นคำนวนหา case 2 โดย คำนวนหา Unit Square to Quadrilateral (ทิศทางจะตรงข้ามกับลูกศรในภาพ)
เมื่อได้ a-h พารามิเตอร์แล้วค่อยนำมาทำ Inverse หา A-H แทน
ด้วยสมการ (สมการนี้ใช้อักษร s t เป็นจุดใน Unit Square แทน u v ตามลำดับ)
ดังนั้นหากเราต้องการหาว่า (x,y) ใน Quadrilateral to Quadrilateral สามารถใช้งานได้ดังนี้
จะได้ (s,t) ที่อยู่ใน Unit Square
โค๊ดตัวอย่าง case 2 ใน matlab
x' = (as + bt +c)/(gs + ht + i)
y' = (ds + et +f)/(gs + ht + i)
จะได้ (x',y') ที่อยู่ใน Quadrilateral ปลายทางที่เราต้องการ Wrap ไป
โค๊ดตัวอย่างการ warp Quadrilateral to Quadrilateralโดยใช้ Go Wrap Matlab
ทดสอบความคลาดเคลื่อนการ warp แบบ Case 3 เทียบ กับ Case 1 + Case 2
โดยใช้จุดมุมของสีเหลี่ยมต้นทางไปยังสีเหลี่ยมปลายทาง
แล้ววัดค่าความคาดเคลื่อนจากจุดมุมที่แท้จริงของสีเหลี่ยมปลายทาง
ได้ผลออกมาดังนี้
Go Wrap Matlab Library
หมายเหตุระยะทางหน่วยเป็น Pixel
จะสังเกตุได้ว่าค่าที่คลาดเคลื่อนเกิดขึ้นในแนวแกน x เท่านั้น และคลาดเคลื่อนอยู่ในระดับที่ยอมรับได้
ดาวน์โหลด Go Wrap Matlab Library
โค๊ดตัวอย่าง case 1 ใน matlab
ต่อจากนั้นคำนวนหา case 2 โดย คำนวนหา Unit Square to Quadrilateral (ทิศทางจะตรงข้ามกับลูกศรในภาพ)
เมื่อได้ a-h พารามิเตอร์แล้วค่อยนำมาทำ Inverse หา A-H แทน
ด้วยสมการ (สมการนี้ใช้อักษร s t เป็นจุดใน Unit Square แทน u v ตามลำดับ)
ดังนั้นหากเราต้องการหาว่า (x,y) ใน Quadrilateral to Quadrilateral สามารถใช้งานได้ดังนี้
จะได้ (s,t) ที่อยู่ใน Unit Square
โค๊ดตัวอย่าง case 2 ใน matlab
x' = (as + bt +c)/(gs + ht + i)
y' = (ds + et +f)/(gs + ht + i)
จะได้ (x',y') ที่อยู่ใน Quadrilateral ปลายทางที่เราต้องการ Wrap ไป
โค๊ดตัวอย่างการ warp Quadrilateral to Quadrilateralโดยใช้ Go Wrap Matlab
ทดสอบความคลาดเคลื่อนการ warp แบบ Case 3 เทียบ กับ Case 1 + Case 2
โดยใช้จุดมุมของสีเหลี่ยมต้นทางไปยังสีเหลี่ยมปลายทาง
แล้ววัดค่าความคาดเคลื่อนจากจุดมุมที่แท้จริงของสีเหลี่ยมปลายทาง
ได้ผลออกมาดังนี้
Go Wrap Matlab Library
หมายเหตุระยะทางหน่วยเป็น Pixel
จะสังเกตุได้ว่าค่าที่คลาดเคลื่อนเกิดขึ้นในแนวแกน x เท่านั้น และคลาดเคลื่อนอยู่ในระดับที่ยอมรับได้
ดาวน์โหลด Go Wrap Matlab Library
ไม่มีความคิดเห็น:
แสดงความคิดเห็น