2017-11-22 30 views
0

私はレンダリングした3D .vtkモデルを持っており、結果はvtkContourFilter(Ubuntu 16.04でvtkバージョン7.0.0を使用)を使用して輪郭を抽出します。vtk C++ contourfilterから輪郭を更新

私は異なる視点から投影したいと思いますが、カメラの位置が変わったことを確認しました(私はカメラ位置が実際に変更されていることを確認しました)。各反復で起動するインタラクティブビューアは常に最初の画像。

見つかった輪郭点(私はvtkPolyDataとして保存されています)の最初の数個の座標を出力すると、私の輪郭点セットの内容は変わらないことにも気付きました。

ContFilter->Modified(); 
ContFilter->Update(); 

polyData->Modified(); // This is the 3D vtkPolyData that I project 

ContFilter->SetValue(0, 10); 
ContFilter->SetValue(0, 255); 

を私も追加しようとした野生の推測通り:

は、私はそのような追加などの他人のために働いていたいくつかのオンラインの提案を、試してみました:

ContourFilterを使用する前に、forループ内の

が、更新されません。それで、私は、私が考えることができ、オンラインで見つけることができるすべてを試みました。

これは、関連するコードです:

// Prepare the rendering environment to project the 3D model to an image from different perspectives 
    vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New(); 
    mapper->SetInputData(polyData); 
    mapper->ScalarVisibilityOff(); 

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); 
    actor->SetMapper(mapper); 
    actor->GetProperty()->SetInterpolationToFlat(); 

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); 
    renderer->SetBackground(1,1,1); 
    renderer->AddActor(actor); 

    vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New(); 
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); 
    renderWindow->SetOffScreenRendering(1); 
    vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter = vtkSmartPointer<vtkWindowToImageFilter>::New(); 
    vtkSmartPointer<vtkContourFilter> ContFilter = vtkSmartPointer<vtkContourFilter>::New(); 
    vtkSmartPointer<vtkPolyData> contour = vtkSmartPointer<vtkPolyData>::New(); 

    // Loop over the camera positions. At each iteration render/project, 
    // extract the contour and finally render the 3D model and the found 
    // contour 
    double * iPoint; 
    double * camPos; 
    double * contourStart; 
    int nContours; 
    for(int i=0; i<positions->GetNumberOfPoints(); i++){ 
     // Print the camera position 
     iPoint = positions->GetPoint(i); 
     std::cout << iPoint[0] << " " << iPoint[1] << " " << iPoint[2] << std::endl; 

     //Move camera 
     camera->SetPosition(iPoint[0], iPoint[1], iPoint[2]); 
     camera->SetFocalPoint(focalPointOrig[0], focalPointOrig[1], focalPointOrig[2]); 
     camera->SetViewAngle(viewAngle); 
     camera->Modified(); 
     camera->SetRoll(90); 

     // Does this help to update the view? 
     polyData->Modified(); 

     // Remove old links and set them again 
     renderWindow->RemoveRenderer(renderer); 
     mapper->RemoveAllInputs(); 
     renderer->SetActiveCamera(camera); 
     renderWindow->AddRenderer(renderer); 
     renderer->Modified(); 
     renderer->ResetCameraClippingRange(); 
     renderWindow->Modified(); 

     // Render/project the data 
     mapper->SetInputData(polyData); 
     renderWindow->Render(); 

     // Print camera position for debugging 
     camera->GetPosition(camPos); 
     std::cout << camPos[0] << " " << camPos[1] << " " << camPos[2] << std::endl; 

     // Get the image and apply a contourfilter 
     windowToImageFilter->SetInput(renderWindow); 
     windowToImageFilter->Update(); 
     ContFilter->SetInputConnection(windowToImageFilter->GetOutputPort()); 

     // Saw someone do this as a workaround for updating the view 
     ContFilter->SetValue(0, 10); 
     ContFilter->SetValue(0, 255); 

     // Does this help to update the view? 
     ContFilter->Modified(); 

     //Get the contour from the contourfilter 
     ContFilter->Update(); 
     contour = ContFilter->GetOutput(); 

     // Print the first points coordinates to see if they changed 
     contourStart = contour->GetPoint(1); 
     std::cout << contourStart[0] << " " << contourStart[1] << " " << std::endl; 

     // Print the number of contours to see if it may be stored as an additional contour 
     nContours = ContFilter->GetNumberOfContours(); 
     std::cout << nContours << std::endl; 


     // Render the 3D model and the found contour 
     actor->GetProperty()->SetColor(0.9,0.9,0.8); 

     // Create a mapper and actor of the silhouette 
     vtkSmartPointer<vtkPolyDataMapper> mapper_contour = vtkSmartPointer<vtkPolyDataMapper>::New(); 
     mapper_contour->SetInputData(contour); 

     // Try this again here 
     polyData->Modified(); 

     vtkSmartPointer<vtkActor> actor_contour = vtkSmartPointer<vtkActor>::New(); 
     actor_contour->SetMapper(mapper_contour); 
     actor_contour->GetProperty()->SetLineWidth(2.); 

     // 2 renderers and a render window 
     vtkSmartPointer<vtkRenderer> renderer1 = vtkSmartPointer<vtkRenderer>::New(); 
     renderer1->AddActor(actor); 
     vtkSmartPointer<vtkRenderer> renderer2 = vtkSmartPointer<vtkRenderer>::New(); 
     renderer2->AddActor(actor_contour); 

     // Set the 3D model renderer to the same perspective but don't change the camera perspective of the contour 
     renderer1->SetActiveCamera(camera); 

     // Setup the window 
     vtkSmartPointer<vtkRenderWindow> renderwindow = vtkSmartPointer<vtkRenderWindow>::New(); 
     renderwindow->SetSize(1600, 800); 
     renderwindow->AddRenderer(renderer1); 
     renderer1->SetViewport(0., 0., 0.5, 1.); 
     renderwindow->AddRenderer(renderer2); 
     renderer2->SetViewport(0.5, 0., 1., 1.); 

     // Setup the interactor 
     vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); 
     vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); 
     iren->SetRenderWindow(renderwindow); 
     iren->SetInteractorStyle(style); 

     // Display the coordinate system axes 
     vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New(); 
     vtkSmartPointer<vtkOrientationMarkerWidget> widget = vtkSmartPointer<vtkOrientationMarkerWidget>::New(); 
     widget->SetOutlineColor(0.9300, 0.5700, 0.1300); 
     widget->SetOrientationMarker(axes); 
     widget->SetInteractor(iren); 
     widget->SetViewport(0.0, 0.0, 0.4, 0.4); 
     widget->SetEnabled(1); 
     widget->InteractiveOn(); 

     // Render the 3D model and the found contour 
     renderwindow->Render(); 
     iren->Start(); 

    } 

答えて

0

ただ答えを見つけました。 vtkWindowToImageFilterクラス参照のWebページ(https://www.vtk.org/doc/nightly/html/classvtkWindowToImageFilter.html)の詳細な説明に警告で述べたように、あなたが彼らのModified()関数を呼び出す場合を除き

vtkWindowsは、一般的に再描画しません。今私の投影されたビューは私が望むように更新されます。

だから私は、今までに上記のリンクは動作を停止した場合には、ここで警告テキストを参照してください

// Get the image and apply a contourfilter 
windowToImageFilter->Modified(); 
windowToImageFilter->SetInput(renderWindow); 
windowToImageFilter->Update(); 

// Get the image and apply a contourfilter 
windowToImageFilter->SetInput(renderWindow); 
windowToImageFilter->Update(); 

を変更:

警告: A vtkWindowはないがVTKパイプラインの他の部分と同様に動作します。画像がレンダリングされると、その変更時刻は更新されません。その結果、vtkWindowToImageFilterを単純に使用すると、ウィンドウがレンダリングされた最初のイメージのイメージが生成されますが、その後のウィンドウの更新時には更新されません。この挙動は予想外であり、一般に望ましくない。 出力イメージの更新を強制するには、ウィンドウにレンダリングした後にvtkWindowToImageFilterのModifiedメソッドを呼び出します。 VTKバージョン4以降では、このフィルタはウィンドウのイメージをファイルに出力する標準的な方法の一部です(3.2以前のvtkRenderWindowsの廃止されたSaveImageAsPPMメソッドを置き換えます)。このフィルタをウィンドウの出力に接続し、フィルタの出力をvtkPNGWriterなどのライタに接続します。 アルファプレーンの読み込みは、レンダリングウィンドウのGetRGBACharPixelDataメソッドの正しい操作に依存します。これは、ウィンドウのアルファプレーンの構成に依存します。 VTK 4.4以降では、マシン依存の動作はこれらの依存関係のために自動的に保証されません。