Đối với dự án thực tế tăng cường của tôi, tôi có một mô hình 3D được xem bằng camera VTK và một đối tượng thực sự của mô hình được xem bằng máy ảnh thực.Làm cách nào để áp dụng tính năng chuyển đổi tư thế máy ảnh bằng tính năng EPnP sang máy ảnh VTK?
Tôi đã sử dụng EPnP để ước tính ma trận bên ngoài của camera thực (máy ảnh này đã được hiệu chuẩn trước khi cầm tay, vì vậy tôi biết các thông số bên trong) bằng cách cho điểm 3D từ VTK và điểm 2D tương ứng của nó từ hình ảnh camera thực và các thông số nội bộ của camera thực cho thuật toán EPnP hoạt động.
Sau đó, tôi thu được ma trận xoay và dịch với các phần tử -> R1, R2, R3, ....., R9 và t1, t2 và t3.
Vì vậy, ma trận bên ngoài của tôi về máy ảnh thực sự trông như thế này (chúng ta hãy gọi extrinsicReal này)
R1 R2 R3 T1
R4 R5 R6 T2
R7 R8 R9 T3
0 0 0 1
Sau này, tôi ước lượng ma trận bên ngoài của máy ảnh VTK của tôi bằng cách sử dụng đoạn mã sau:
vtkSmartPointer<vtkMatrix4x4> extrinsicVTK = vtkSmartPointer<vtkMatrix4x4>::New();
extrinsicVTK->DeepCopy(renderer->GetActiveCamera()->GetViewTransformMatrix());
Để kết hợp mô hình 3D camera VTK với camera thực, camera VTK phải được đặt ở vị trí giống với vị trí camera thực và độ dài tiêu cự của camera VTK phải giống như camera thực của camera . Một bước quan trọng khác là áp dụng cùng ma trận bên ngoài của camera thực cho camera VTK. Tôi phải làm nó như thế nào?
Những gì tôi đã làm là tôi lấy nghịch đảo của extrinsicReal và nhân với extrinsicVTK để lấy ma trận 4 * 4 mới (hãy gọi nó là newMatrix). Tôi đã áp dụng ma trận này cho việc chuyển đổi camera VTK.
vtkSmartPointer<vtkMatrix4x4> newMatrix = vtkSmartPointer<vtkMatrix4x4>::New();
vtkMatrix4x4::Multiply4x4(extrinsicRealInvert,extrinsicVTK,newMatrix);
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->SetMatrix(NewM);
transform->Update();
renderer->GetActiveCamera()->ApplyTransform(transform);
Tôi không thực sự chắc chắn nếu đây là phương pháp đúng. Nhưng tôi đã kiểm tra vị trí camera thực (mà tôi nhận được sau EPnP) và vị trí camera VTK (sau khi áp dụng phép biến đổi ở trên) và cả hai đều giống hệt nhau. Ngoài ra, định hướng của camera thực và hướng chiếu của camera VTK cũng giống nhau.
Vấn đề là ngay cả sau khi các thông số trên phù hợp với cả VTK và máy ảnh thực, mô hình VTK 3D dường như không hoàn toàn phù hợp với video camera thực. Ai đó có thể hướng dẫn tôi từng bước để gỡ lỗi vấn đề không?
Chỉ muốn nói rằng điều này thực sự là điểm trên. Các tài liệu VTK là một cơn ác mộng vì vậy nó tuyệt vời để vấp ngã khi một cái gì đó như thế này sau khi đập đầu của chúng tôi chống lại một bức tường trong 4 tháng qua. Tôi thậm chí không bao giờ coi chức năng SetWindowCenter! Chúng tôi vẫn nhận được khoản chênh lệch khá rõ ràng do kích thước cửa sổ (Lỗi thay đổi với thay đổi kích thước), nhưng mọi thứ khác hoạt động tốt ngay bây giờ mà chúng tôi đã điều chỉnh một số kỹ thuật của bạn. Tôi cảm thấy bạn trên tài liệu VTK. Nó thực sự là một cơn ác mộng để tìm ra những gì đang xảy ra. Ai đó cần phải sửa lại điều đó. – SwarthyMantooth
Tôi không hiểu phần áp dụng bên ngoài. Vai trò của ma trận quy mô với hai dấu hiệu tiêu cực là gì? Nếu R và t là các giá trị từ ma trận bên ngoài OpenCV, vị trí của máy ảnh phải là '-Rinv * t', và xem nên là' Rinv [:, 1] 'và tiêu điểm nên là' camera_pos - Rinv [:, 2 ] '. Khi tôi áp dụng điều này, tôi không có được sự chồng chất chính xác của mô hình. Ngay cả khi tôi áp dụng chuyển đổi của bạn giả định m_CameraExtrinsicMatrix có định dạng của ma trận OpenCV, tôi không nhận được kết xuất chính xác. – krips89
Một phiên bản sạch hơn trong cùng một cách tiếp cận được chỉ ra trong câu trả lời tuyệt vời của @ Michael cho phần 'bên ngoài' bên dưới (trong python): (1) camera.SetPosition (* eye) (2) camera.SetFocalPoint (* center) (3) camera.SetViewUp (* up), trong đó '' 'eye = (-R'T), center = eye + R '(0,0,1)', up = -R [0] [1]' ' ' – squid