วิธีการ unproject สี่เหลี่ยมสามเหลี่ยมเป็นสี่เหลี่ยม?


10

tl; dr: ปัญหาทางคณิตศาสตร์ในเรขาคณิตของ Projective: เราจะหาเมทริกซ์กล้อง 4x4 บางตัวที่ให้ภาพดังที่แสดงไว้ด้านล่างเช่นจุด A, B, C, D อยู่ที่ไหนสักแห่งบนขอบของกล่องหน่วย (เช่นอุปกรณ์มาตรฐาน OpenGL พิกัด) และมุมของกล่องยูนิตอยู่ในจุดที่เหมาะสมตามแนว EA, EB, EC, ED?

(นี่อาจเป็นกรณีพิเศษที่เป็นไปได้ของการทำ homography, perspectivity และ / หรือ collineation ไม่คุ้นเคยกับคำศัพท์)


รายละเอียดเพิ่มเติม

ให้ ABCD รูปสี่เหลี่ยมสามรูปในวิวพอร์ตฉันคิดว่ามีการแปลง (?) ที่ไม่ซ้ำกันซึ่งแมปกลับไปเป็นรูปสี่เหลี่ยมผืนผ้า ดังที่เห็นในภาพด้านล่าง: ABCD รูปสี่เหลี่ยมในวิวพอร์ตทำหน้าที่เป็น 'หน้าต่าง' ทางกายภาพและถ้าเราแมปกลับไปที่สี่เหลี่ยมผืนผ้ามันจะปรากฏผิดเพี้ยน

ป้อนคำอธิบายรูปภาพที่นี่

(ช่องทางด้านขวาแสดงถึง NDC ซึ่งฉันพูดถึงในภายหลัง)

เป้าหมายคือการได้รับภาพทางด้านขวาอย่างรวดเร็ว เราสามารถ raytrace ทุกจุดเพื่อให้ได้ภาพ (ซึ่งฉันได้ทำไปแล้ว) แต่ฉันต้องการใช้ OpenGL หรือเทคนิคการฉายภาพอื่น ๆ เพราะฉันต้องการใช้ประโยชน์จากสิ่งต่าง ๆ เช่นการผสมการใช้งานแบบดั้งเดิมเป็นต้น

ความพยายามครั้งแรก

ฉันเชื่อว่าฉันสามารถแก้ปัญหาในการค้นหาเมทริกซ์กล้อง 3x4 ที่ทำให้พิกัด 3 + 1-มิติเป็นเนื้อเดียวกันใน 3-space (ทางซ้าย) และฉายมันลงไปเป็น 2 + 1 มิติแบบมิติเดียวใน 2-space (บน ทางขวา). เราสามารถแก้ปัญหานี้ได้โดยใช้การแปลงเชิงเส้นโดยตรงเพื่อให้ได้ระบบสมการBa=0สำหรับรายการที่ไม่รู้จักaของเมทริกซ์กล้องและการแก้ปัญหาระบบโดยใช้การสลายตัวของค่าเอกพจน์(SVD) ฉันจะใช้เวกเตอร์ EA, EB, EC, ED (โดยที่ E คือดวงตาทางกายภาพของคุณหรือกล้องในอวกาศโลก) เป็นคะแนนในภาพก่อนและ (0,0), (1,0), (1) , 1), (0,1) หรือบางอย่างที่เป็นจุดในภาพโพสต์และแต่ละคู่ของคะแนนจะให้สมการเชิงเส้นสองสามอันที่จะเสียบเข้ากับ SVD เมทริกซ์ที่ได้นั้นจะแมป EA -> (0,0) เป็นต้น (สมมติว่ามีองศาอิสระพอสมควรเช่นถ้าการแก้ปัญหานั้นไม่เหมือนใครซึ่งฉันไม่แน่ใจให้ดู note [a])

แต่สำหรับความผิดหวังของฉันนี่ไม่ใช่วิธีการทำงานของ OpenGL OpenGL ไม่ได้ฉายภาพ 3 มิติเป็น 2d โดยตรงด้วยเมทริกซ์ 3x4 OpenGL ต้องการ "พิกัดอุปกรณ์ปกติ" (NDC) ซึ่งเป็นจุดสามมิติ หลังจากฉายลงใน NDC ทุกอย่างในกล่อง 'หน่วย' จาก (-1, -1, -1,1) ถึง (1,1,1,1) จะถูกวาด ทุกสิ่งที่อยู่ด้านนอกถูกตัด (เนื่องจากเรากำลังจัดการกับพิกัดแบบเอกพันธ์: จุดใด ๆ (x, y, z, w) จะปรากฏบนหน้าจอเฉพาะเมื่อสามพิกัดแรกของ (x / w, y / w, z / w , 1) อยู่ในกล่องหน่วยจาก -1 ถึง 1)

ดังนั้นคำถามจะกลายเป็น: มีการเปลี่ยนแปลงที่สมเหตุสมผลหรือไม่ที่แมปคิวบอยที่ดูแปลก ๆ ในพิกัดที่เป็นเนื้อเดียวกัน (โดยเฉพาะคิวบอยที่วาดทางด้านซ้ายด้วย ABCD (จุดหน้า) และ A'B'C'D '(จุดหลังซ่อน ด้านหลังจุดหน้า)) ถึงคิวบ์ยูนิตเช่นใช้เมทริกซ์ 4x4 หรือไม่ เราจะทำอย่างไร

สิ่งที่ฉันได้ลอง

ฉันลองทำอะไรที่แข็งแกร่งกว่า: ฉันทำ ABCD และ A'B'C'D 'ดูเหมือน pyramidal frustrum ปกติ (เช่น gl frustrum) (เช่นในการตั้งค่าสมมุตินี้ภาพทางด้านซ้ายจะมีสี่เหลี่ยมผืนผ้าสีดำวางอยู่บน มันไม่ใช่รูปสี่เหลี่ยม) และใช้การแปลงเชิงเส้นโดยตรง / DLT เพื่อแก้ปัญหาสำหรับเมทริกซ์ 4x4 ที่ถูกกล่าวหา อย่างไรก็ตามเมื่อฉันลองมันดูเหมือนว่าจะมีอิสระไม่มากพอ ... เมทริกซ์ 4x4 ที่ได้นั้นไม่ได้แมปอินพุตเวกเตอร์ทุกตัวกับเอาต์พุตเวกเตอร์ทุกตัว ในขณะที่ใช้ A, B, C, D, A '(5 คู่ของการแปลงล่วงหน้าและเวกเตอร์หลังการแปลง) ฉัน / เกือบ / รับผลที่ฉันต้องการ ... เวกเตอร์ถูกแมปอย่างถูกต้อง แต่สำหรับตัวอย่าง B' C ', D' กำลังจับคู่กับ (3,3,1,1) แทน (-1, -1,1,1) และถูกตัดออกโดย OpenGL ถ้าฉันลองเพิ่มจุดที่หก (6 คะแนนสำหรับเมทริกซ์ 4x4 ลงในโปรเจ็กต์) คำตอบของฉันดูเหมือนจะแย่ลง (ศูนย์, อินฟินิตี้) ฉันมีอิสรภาพแค่ไหนในระดับนี้และเป็นไปได้ด้วยการทำแผนที่ 4x4 เมทริกซ์ 4vector ปกติ (3 + 1-vector-homogeneous-Coordinate vectors) ที่เรารู้จักและชื่นชอบ?

ความคิดเล็กน้อยแบบสุ่ม

ฉันเดาว่ามันเป็นไปไม่ได้ที่จะแมปคิวบอยแบบสุ่มใด ๆ กับเมทริกซ์ 4x4 แบบใดก็ได้ แต่ฉันสับสนเพราะฉันคิดว่ามันเป็นไปได้ที่จะแมปสี่เหลี่ยมสามมิติแบบนูนกับสี่เหลี่ยมนูนแบบอื่นใน 2d พูดได้ว่า Photoshop? ... จะทำได้หรือไม่ไม่สามารถทำได้ด้วยการแปลงโปรเจค และวิธีทั่วไปในการ 3d? ...... ด้วยความพยายามที่ล้มเหลวในการค้นหาเมทริกซ์ 4x4 พีชคณิตเชิงเส้นบอกว่าเราไม่ควรคาดหวังเมทริกซ์ NxN ในการทำแผนที่มากกว่า N แบบอิสระเชิงเส้นตรงไปยังจุดเป้าหมาย N ในกรณีที่ดีที่สุด แต่ฉันรู้สึกว่าเป็นเนื้อเดียวกัน พิกัดโกงสิ่งนี้เพราะมี colinearity ที่ซ่อนอยู่เกิดขึ้น? ฉันเดาว่าไม่?

ทางออกอื่นได้หรือไม่

ฉันเดาว่าคนหนึ่งอาจทำสิ่งที่น่าเกลียดดังต่อไปนี้ซึ่งคุณใช้เมทริกซ์การฉายภาพด้วยกล้อง frustrum ทั่วไปหาจุด 2d ที่สอดคล้องกับมุมจากนั้นทำการถ่ายภาพมุมมองบิดเบือน 2d แต่ถ้ามันเกิดขึ้นหลังจากพิกเซลแสดงผล (เช่น photoshop) จากนั้นจะมีปัญหากับการแก้ปัญหา ... อาจเป็นไปได้ว่าสมมุติฐานหนึ่งสามารถหาเมทริกซ์เพื่อทำการแปลงนี้บนระนาบ XY ภายใน NDC-space แล้วเขียนมันด้วยเมทริกซ์ frustrum ปกติ?

(หมายเหตุ [a]: ระดับความเป็นอิสระ: ABCD สามารถถูก จำกัด ให้เป็นโพสต์อิมเมจของการแปลงโปรเจคชั่นที่ทำบนสี่เหลี่ยมได้ถ้าจำเป็น ... นั่นคือสี่เหลี่ยมสีดำทางซ้ายอาจกล่าวได้ว่าเป็น ผลการฉายภาพตัดปะแบบกรอบรูปภาพ)


1
ถ้าคุณ google สำหรับมุม pin คุณจะได้รับการใช้งานไม่กี่นี้
joojaa

คำตอบ:


1

ฉันคิดว่าวิธีแก้ปัญหาคือมองหาการแปลงแบบ Projective ที่แปลงสี่จุดอย่างถูกต้อง

กล่าวคือ

y=P×x

x=[x0,x1,1]y=[y0y2,y1y2]

P

ตอนนี้คุณสามารถใช้พีชคณิตเพื่อทำสิ่งนี้หรือเพียงแค่ใช้ OpenCV's getPerspectiveTransform:)

ตรวจสอบพิกัด homnogenousบนวิกิพีเดียเพื่อทำความคุ้นเคยกับแนวคิด


ขอบคุณ! (ฉันแก้ไขเรื่องนี้ได้สักพักแล้วและโพสต์คำตอบตอนนี้เมื่อฉันเห็นความคิดเห็นของคุณ)
ninjagecko

0

ฉันจะแก้ไขคำถามของฉันเองโดยการใช้การแปลงเชิงเส้นตรง ส่วนตัวอย่างใน Wikipedia เป็นกรณีการใช้งานของฉัน

ในการรับสมการให้เสียบเมทริกซ์ (เช่น[x1 x2 x3 x4; x5 x6 x7 x8; x9 x10 x11 x12]) เข้ากับระบบพีชคณิตของคอมพิวเตอร์ที่คุณชื่นชอบเช่น SageMath แล้วแก้สมการเมทริกซ์ที่ต้องการดังแสดงในภาพคัดลอกวางโซลูชั่นในรูปของตัวแปรลงในโค้ดของคุณและปรับการจัดรูปแบบ

จากนั้นเราสามารถปรับวิธีการแก้ปัญหาให้กับกรณีการใช้งานโดยปรับขนาดหรือเพิกเฉยขนาดเฉพาะตามความเหมาะสม (เช่นละเว้นการประสานความลึก / z ในเมทริกซ์พิกัดอุปกรณ์ Normalized ตามความเหมาะสมกับกรณีการใช้งาน)

คุณจะต้องมีฟังก์ชั่นการสลายตัว SVD หรือห้องสมุดในภาษาของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.