Với XNA, tôi đang hiển thị một hình chữ nhật đơn giản được chiếu lên sàn. Máy chiếu có thể được đặt ở một vị trí tùy ý. Rõ ràng, hình chữ nhật được chiếu bị biến dạng theo vị trí và góc của máy chiếu. Một Kinect quét sàn tìm bốn góc. Bây giờ mục tiêu của tôi là biến đổi hình chữ nhật ban đầu sao cho hình chiếu không còn bị biến dạng bởi về cơ bản làm cong vênh hình chữ nhật.
Cách tiếp cận đầu tiên của tôi là làm mọi thứ trong 2D: Đầu tiên tính toán chuyển đổi phối cảnh (sử dụng OpenCV warpPerspective()
) từ các điểm được quét sang các điểm của hình chữ nhật bên trong, không áp dụng nghịch đảo cho hình chữ nhật. Điều này dường như hoạt động nhưng quá chậm vì nó không thể được hiển thị trên GPU.
Cách tiếp cận thứ hai là làm mọi thứ trong 3D để sử dụng các tính năng kết xuất của XNA. Đầu tiên, tôi sẽ hiển thị một mặt phẳng, quét các góc của nó bằng Kinect và ánh xạ các Điểm 3D nhận được vào mặt phẳng ban đầu. Về mặt lý thuyết, tôi có thể áp dụng nghịch đảo của phép biến đổi phối cảnh cho mặt phẳng, như tôi đã làm trong phương pháp 2D. Tuy nhiên, vì XNA hoạt động với ma trận xem và ma trận chiếu, tôi không thể chỉ gọi một hàm như warpPerspective()
và nhận được kết quả mong muốn. Tôi sẽ cần tính toán các tham số mới cho chế độ xem và ma trận chiếu của máy ảnh.
Câu hỏi: Có thể tính toán các tham số này và chia chúng thành hai ma trận (xem và chiếu) không? Nếu không, có cách nào khác tôi có thể sử dụng?
warpPespective
? Tôi không quen thuộc với OpenCV, nhưng đọc tài liệu có vẻ như chức năng này chỉ áp dụng một phối cảnh cho một hình ảnh. Hay tôi bối rối? Dù sao, có thể thêm chi tiết về việc thực hiện đầu tiên của bạn sẽ giúp ích.