Koreksi Keystone menggunakan 3D-Points of Kinect

15

Dengan XNA, saya menampilkan persegi panjang sederhana yang diproyeksikan ke lantai. Proyektor dapat ditempatkan pada posisi sewenang-wenang. Jelas, persegi panjang yang diproyeksikan akan terdistorsi sesuai dengan posisi dan sudut proyektor. A Kinect memindai lantai mencari empat sudut. Sekarang tujuan saya adalah untuk mengubah persegi panjang asli sehingga proyeksi tidak lagi terdistorsi oleh dasarnya pra-melengkung persegi panjang.

Pendekatan pertama saya adalah melakukan semuanya dalam 2D: Pertama menghitung transformasi perspektif (menggunakan OpenCV warpPerspective()) dari titik yang dipindai ke titik persegi panjang internal dan menerapkan kebalikannya ke persegi panjang. Ini tampaknya berhasil tetapi terlalu lambat karena tidak dapat ditampilkan pada GPU.

Pendekatan kedua adalah melakukan segalanya dalam 3D untuk menggunakan fitur rendering XNA. Pertama, saya akan menampilkan pesawat, memindai sudut-sudutnya dengan Kinect dan memetakan Poin 3D yang diterima ke pesawat asli. Secara teoritis, saya bisa menerapkan kebalikan dari transformasi perspektif ke pesawat, seperti yang saya lakukan dalam pendekatan 2D. Namun, karena XNA bekerja dengan tampilan dan matriks proyeksi, saya tidak bisa begitu saja memanggil fungsi seperti warpPerspective()dan mendapatkan hasil yang diinginkan. Saya perlu menghitung parameter baru untuk tampilan dan proyeksi matriks kamera.

Pertanyaan: Apakah mungkin untuk menghitung parameter ini dan membaginya menjadi dua matriks (tampilan dan proyeksi)? Jika tidak, apakah ada pendekatan lain yang bisa saya gunakan?

phillly
sumber
1
XNA menggunakan View dan matriks Proyeksi, tapi saya pikir hasil akhirnya = vektor * tampilan * proyeksi. Mengapa tidak mencoba membuat tampilan matriks identitas dan memproyeksikan matriks perspektif terbalik dan melihat apakah itu berhasil? (Tidak 100% yakin bahwa inilah yang terjadi)
Roy T.
1
Bagaimana tepatnya Anda menghitung transformasi perspektif denganwarpPespective ? Saya tidak terbiasa dengan OpenCV, tetapi membaca dokumen sepertinya fungsi ini hanya menerapkan perspektif pada gambar. Atau saya bingung? Bagaimanapun, mungkin menambahkan lebih banyak detail pada implementasi pertama Anda akan membantu.
Laurent Couvidou
Anda mungkin ingin melihat perpustakaan PCL ( pointclouds.org ). Mengubah gambar kedalaman dari kinect memberi Anda titik awan dengan kamera di titik asal, menunjuk sepanjang sumbu z. Anda kemudian dapat menggunakan ransac atau algoritma lain untuk mencari pesawat.
Exilyth

Jawaban:

1

Karena vektor aljabar ramah GPU, normalisasi dan produk titik dapat digunakan untuk menemukan empat sudut pesawat asli sebagai berikut:

masukkan deskripsi gambar di sini

Mengingat titik proyektor (P), titik proyeksi (B), satu titik sembarang pada bidang yang berisi persegi panjang terdistorsi (Q), dan vektor normal ke bidang itu (n), titik persimpangan (A) dari baris dari P ke B, dan pesawat diberikan oleh

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

Sumber http://geomalgorithms.com/a05-_intersect-1.html bagian Line-Plane Intersection

rraallvv
sumber