ทำงานยังไง?

ทำไมต้องจัดแนวรูป

ถ่ายรูปต้นไม้ทุกวันด้วยมือถือ ตำแหน่งกล้อง มุม และระยะซูมแทบไม่มีทางเหมือนกันเป๊ะทุกครั้ง — เอียงไปคนละทาง ขยับซ้ายขวา ใกล้ไกลไม่เท่ากัน ถ้าเอารูปมาเรียงต่อกันตรงๆ เป็นวิดีโอ ภาพจะสั่นไหวจนดูไม่รู้เรื่อง เว็บนี้แก้ปัญหาด้วยการหา similarity transform (ขยับ + หมุน + ย่อ/ขยายเท่ากันทุกทิศทาง) ที่แปลงแต่ละรูปให้จุดอ้างอิงตรงกับรูปแรกเป๊ะ ก่อนเอามาต่อเป็น timelapse

ทำไมใช้ 2 จุดที่คนคลิกเอง แทนการหาจุดอัตโนมัติ (auto CV)

ระบบจดจำจุดเด่นอัตโนมัติ (feature detection แบบ ORB/SIFT ที่ใช้ในโปรแกรม stitch panorama) ทำงานได้ดีกับฉาก ที่มีลวดลายชัดเจนคงที่ แต่ต้นไม้เปลี่ยนรูปร่างทุกวัน (ใบใหม่ กิ่งโต ใบร่วง) จุดเด่นที่ตรวจจับได้วันนี้อาจหายไปพรุ่งนี้ ทำให้จับคู่จุดผิดพลาดบ่อย และแก้ไขยาก เมื่อเทียบกับการให้คนจิ้ม 2 จุดเอง (เช่น ขอบกระถางซ้าย-ขวา ซึ่งไม่ขยับ) — ช้ากว่าแต่ แม่นตายตัว 100% และเข้าใจง่ายว่าทำไมผลลัพธ์ออกมาแบบนี้

คณิตศาสตร์: หา similarity transform จาก 2 คู่จุด

Similarity transform คือฟังก์ชัน f(p) = m·p + c โดยที่ p, m, c เป็นจำนวนเชิงซ้อน (มองพิกัด (x, y) เป็น x + iy) — ตัวคูณ m เก็บทั้งอัตราขยาย (|m| = scale) และมุมหมุน (arg(m) = rotation) ไว้ในตัวเดียว ส่วน c คือ การเลื่อนตำแหน่ง (translation)

กำหนดจุดที่คลิกในรูปที่จะจัดแนว a1, a2 กับจุดเดียวกันบนรูปอ้างอิง b1, b2 ต้องการ f(a1) = b1 และ f(a2) = b2:

m·a1 + c = b1
m·a2 + c = b2

ลบสมการสองข้างเพื่อตัด c ทิ้ง จะได้ m แบบปิดรูป (closed form) ทันที:

m = (b2 - b1) / (a2 - a1)

แล้วแทนกลับหา c:

c = b1 - m·a1

จากนั้นทุกจุดในรูปแปลงตำแหน่งด้วยสูตรเดียวกัน: p' = m·p + c เพราะ scale กับ rotation คูณกันแบบจำนวน เชิงซ้อนสลับที่ได้ (commute) สูตรนี้จึงตรงกับการวาดบน canvas ด้วยลำดับ translate → rotate → scale พอดี

รูปอ้างอิง (รูปแรก) ก็ผ่านสูตรเดียวกันนี้โดยใช้จุดของตัวเองเป็นทั้งต้นทางและปลายทาง (a1=b1, a2=b2) ซึ่งให้ผลลัพธ์ เป็น identity transform (scale=1, rotation=0, translate=0) พอดี — ไม่ต้องเขียนเคสพิเศษแยกสำหรับรูปอ้างอิง

ครอปภาพร่วมยังไง (common crop rect)

หลังแปลงพิกัดแล้ว แต่ละรูปจะครอบคลุมพื้นที่เป็นสี่เหลี่ยมที่อาจเอียงในพิกัดของรูปอ้างอิง (เพราะมีการหมุน) ระบบหาสี่เหลี่ยมมุมฉากที่ใหญ่ที่สุดที่แนบอยู่ในสี่เหลี่ยมเอียงนั้นได้ (สูตรปิดรูปเช่นกัน จากมุมหมุนกับอัตราส่วนกว้างยาว) แล้วเอาสี่เหลี่ยมมุมฉากของทุกรูปมาตัดกัน (intersection) เพื่อให้ได้กรอบครอปเดียวที่ทุกเฟรมมีพื้นที่ภาพจริง เต็มกรอบ ไม่มีมุมโล่งดำจากการหมุน/เลื่อน

ข้อจำกัด