2013-08-02 45 views
5

Tôi cố gắng để làm cho quan điểm của một lưới 3D trong VTK, tôi đang làm như sau:OpenGL/VTK: đặt camera thông số nội tại

vtkSmartPointer<vtkRenderWindow> render_win = vtkSmartPointer<vtkRenderWindow>::New(); 
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); 

render_win->AddRenderer(renderer); 
render_win->SetSize(640, 480); 

vtkSmartPointer<vtkCamera> cam = vtkSmartPointer<vtkCamera>::New(); 

cam->SetPosition(50, 50, 50); 
cam->SetFocalPoint(0, 0, 0); 
cam->SetViewUp(0, 1, 0); 
cam->Modified(); 

vtkSmartPointer<vtkActor> actor_view = vtkSmartPointer<vtkActor>::New(); 

actor_view->SetMapper(mapper); 
renderer->SetActiveCamera(cam); 
renderer->AddActor(actor_view); 

render_win->Render(); 

Tôi cố gắng để mô phỏng một vẽ từ một Kinect hiệu chuẩn, cho mà tôi biết các thông số nội tại. Làm thế nào tôi có thể thiết lập các thông số nội tại (tiêu cự và điểm nguyên tắc) cho vtkCamera.

Tôi muốn thực hiện điều này sao cho tọa độ camera 2d - 3d sẽ giống như hình ảnh được chụp từ kinect.

Trả lời

3

Tôi cũng đang sử dụng VTK để mô phỏng chế độ xem từ cảm biến kinect. Tôi đang sử dụng VTK 6.1.0. Tôi biết câu hỏi này là cũ, nhưng hy vọng câu trả lời của tôi có thể giúp đỡ người khác.

Câu hỏi đặt ra là làm thế nào chúng ta có thể đặt ma trận chiếu để ánh xạ tọa độ thế giới tới tọa độ clip. Để biết thêm thông tin về điều này, hãy xem điều này OpenGL explanation.

Tôi sử dụng Ma trận chiếu quan điểm để mô phỏng cảm biến kinect. Để kiểm soát các tham số nội tại, bạn có thể sử dụng các chức năng thành viên sau của vtkCamera.

double fov = 60.0, np = 0.5, fp = 10; // the values I use 
cam->SetViewAngle(fov);    // vertical field of view angle 
cam->SetClippingRange(np, fp);  // near and far clipping planes 

Để cung cấp cho bạn cảm nhận về hình dạng. Tôi có một old project mà tôi đã làm hoàn toàn trong C++ và OpenGL, trong đó tôi đặt Ma trận Chiếu tương tự như cách tôi mô tả, nắm lấy bộ đệm z, và sau đó chiếu lại các điểm trên một cảnh mà tôi đã xem từ một máy ảnh khác. (Các đám mây điểm hình dung trông ồn ào vì tôi cũng mô phỏng tiếng ồn).

Nếu bạn cần Ma trận chiếu tùy chỉnh của riêng mình không phải là hương vị Phối cảnh. Tôi tin rằng đó là:

cam->SetUserTransform(transform); // transform is a pointer to type vtkHomogeneousTransform 

Tuy nhiên, tôi chưa sử dụng phương pháp SetUserTransform.

8

Hy vọng rằng điều này sẽ giúp những người khác cố gắng chuyển đổi các thông số camera pinhole chuẩn thành vtkCamera: Tôi đã tạo một ý chính cho biết cách thực hiện chuyển đổi đầy đủ. Tôi đã xác minh rằng thế giới trỏ dự án đến vị trí chính xác trong hình ảnh được hiển thị. Mã khóa từ gist được dán dưới đây.

ý chính: https://gist.github.com/decrispell/fc4b69f6bedf07a3425b

// apply the transform to scene objects 
    camera->SetModelTransformMatrix(camera_RT); 

    // the camera can stay at the origin because we are transforming the scene objects 
    camera->SetPosition(0, 0, 0); 
    // look in the +Z direction of the camera coordinate system 
    camera->SetFocalPoint(0, 0, 1); 
    // the camera Y axis points down 
    camera->SetViewUp(0,-1,0); 

    // ensure the relevant range of depths are rendered 
    camera->SetClippingRange(depth_min, depth_max); 

    // convert the principal point to window center (normalized coordinate system) and set it 
    double wcx = -2*(principal_pt.x() - double(nx)/2)/nx; 
    double wcy = 2*(principal_pt.y() - double(ny)/2)/ny; 
    camera->SetWindowCenter(wcx, wcy); 

    // convert the focal length to view angle and set it 
    double view_angle = vnl_math::deg_per_rad * (2.0 * std::atan2(ny/2.0, focal_len)); 
    std::cout << "view_angle = " << view_angle << std::endl; 
    camera->SetViewAngle(view_angle); 
+0

Cảm ơn câu trả lời này!Tôi đã dành một tuần cố gắng để làm cho máy ảnh vtk để xem cùng tôi mong đợi để xem với một máy ảnh pinhole và tôi gần như có được nó chính xác nhưng luôn luôn có một số sự khác biệt. Để máy ảnh yên tĩnh và di chuyển khung cảnh hoạt động tốt! – martinako

+0

Công trình này hoạt động! Đánh giá cao! – alanwsx

0

chủ đề này là siêu hữu ích cho tôi để thiết lập intrinsics camera trong VTK, câu trả lời đặc biệt decrispell của. Tuy nhiên, để hoàn thành, một trường hợp bị thiếu: nếu độ dài tiêu cự theo hướng x và y không bằng nhau. Điều này có thể dễ dàng được thêm vào mã bằng cách sử dụng phương thức SetUserTransform. Dưới đây là một mẫu mã trong python:

cam = self.renderer.GetActiveCamera() 
m = np.eye(4) 
m[0,0] = 1.0*fx/fy 
t = vtk.vtkTransform() 
t.SetMatrix(m.flatten()) 
cam.SetUserTransform(t) 

nơi fx và fy là x và chiều dài tiêu cự y bằng pixel, ví dụ: hai yếu tố diagnoal đầu tiên của ma trận camera nội tại. np là và bí danh cho nhập khẩu gọn gàng.

Dưới đây là một ý chính thể hiện giải pháp đầy đủ trong python (không có extrinsics để đơn giản). Nó đặt một hình cầu ở vị trí 3D cho sẵn, hiển thị cảnh vào hình ảnh sau khi đặt nội tại máy ảnh, và sau đó hiển thị vòng tròn màu đỏ tại phép chiếu trung tâm hình cầu trên mặt phẳng ảnh: https://gist.github.com/benoitrosa/ffdb96eae376503dba5ee56f28fa0943