Keystone Correction โดยใช้ 3D-Points of Kinect


15

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

วิธีแรกของฉันคือทำทุกอย่างใน 2D: ก่อนอื่นคำนวณการแปลงเปอร์สเปคทีฟ (โดยใช้ OpenCV warpPerspective()) จากจุดที่สแกนไปยังจุดภายในของสี่เหลี่ยม ดูเหมือนว่าจะใช้งานได้ แต่ช้าเกินไปเนื่องจากไม่สามารถแสดงผลบน GPU ได้

แนวทางที่สองคือการทำทุกอย่างในรูปแบบ 3 มิติเพื่อใช้คุณสมบัติการแสดงผลของ XNA ก่อนอื่นฉันจะแสดงเครื่องบินสแกนมุมของมันด้วย Kinect และทำแผนที่คะแนน 3D ที่ได้รับไปยังระนาบเดิม ในทางทฤษฎีฉันสามารถใช้การผกผันของการแปลงมุมมองกับระนาบได้เช่นเดียวกับที่ฉันทำในแบบสองมิติ อย่างไรก็ตามเนื่องจาก XNA ทำงานร่วมกับเมทริกซ์มุมมองและเส้นโครงร่างฉันจึงไม่สามารถเรียกฟังก์ชันเช่นwarpPerspective()และรับผลลัพธ์ที่ต้องการได้ ฉันต้องคำนวณพารามิเตอร์ใหม่สำหรับมุมมองและเมทริกซ์การฉายของกล้อง

คำถาม: เป็นไปได้ไหมที่จะคำนวณพารามิเตอร์เหล่านี้และแยกออกเป็นสองเมทริกซ์ (มุมมองและการฉายภาพ)? ถ้าไม่มีวิธีอื่นที่ฉันสามารถใช้ได้หรือไม่?


1
XNA ใช้มุมมองและเมทริกซ์การฉาย แต่ฉันคิดว่าผลลัพธ์สุดท้าย = เวกเตอร์ * มุมมอง * ทำไมไม่ลองดูเมทริกซ์เอกลักษณ์และประมาณการเมทริกซ์มุมมองผกผันและดูว่ามันใช้ได้หรือไม่ (ไม่แน่ใจ 100% ว่านี่เป็นสิ่งที่เกิดขึ้นจริง ๆ )
รอยต

1
คุณคำนวณการเปลี่ยนมุมมองด้วยวิธีwarpPespectiveใด? ฉันไม่คุ้นเคยกับ OpenCV แต่การอ่านเอกสารดูเหมือนว่าฟังก์ชั่นนี้ใช้มุมมองกับภาพ หรือฉันสับสน อย่างไรก็ตามการเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับการใช้งานครั้งแรกของคุณอาจช่วยได้
Laurent Couvidou

คุณอาจต้องการดูที่ห้องสมุด PCL ( pointclouds.org ) การแปลงภาพความลึกจาก kinect ช่วยให้คุณมีเมฆจุดด้วยกล้องที่จุดกำเนิดโดยชี้ไปตามแกน z จากนั้นคุณสามารถใช้ ransac หรืออัลกอริทึมอื่นเพื่อค้นหาระนาบ
Exilyth

คำตอบ:


1

เนื่องจากพีชคณิตเวกเตอร์นั้นเป็นมิตรกับ GPU จึงสามารถใช้การทำให้เป็นมาตรฐานและจุดผลิตภัณฑ์เพื่อค้นหามุมทั้งสี่ของระนาบเดิมดังต่อไปนี้:

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

เมื่อพิจารณาถึงจุดโปรเจ็กเตอร์ (P), จุดที่คาดการณ์ (B), จุดใดจุดหนึ่งบนเครื่องบินที่มีรูปสี่เหลี่ยมผืนผ้าบิดเบี้ยว (Q) และเวกเตอร์ปกติไปยังระนาบ (n), จุดตัด (A) ของ เส้นจาก P ถึง B และระนาบกำหนดโดย

s = -dot_product(n, P - Q) / dot_product(n, normalized(B - P)) 
A = P + s * normalized(B-P)

แหล่งที่มาhttp://geomalgorithms.com/a05-_intersect-1.htmlส่วนทางแยกของเครื่องบิน

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