- vtkImageContourWidget:绘制轮廓线。所绘制的轮廓线可以是闭合的也可以是不闭合的,取决于最后一个点的位置。

- vtkImageTracerWidget:绘制轨迹线。该类在手动分割图像中应用比较多。

demo
#include <vtkActor.h>
#include <vtkCallbackCommand.h>
#include <vtkImageActor.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkImageMapper3D.h>
#include <vtkImageTracerWidget.h>
#include <vtkInteractorStyleImage.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>
#include <array>
#include <vtkAutoInit.h>
#include <vtkObject.h>
#include <vtkPNGReader.h>
#include <vtkBMPReader.h>
#include <vtkImageData.h>
#include <vtkImageAppendComponents.h>
#include <vtkImageAccumulate.h>
#include <vtkImageStencilToImage.h>
#include <vtkImageAppendComponents.h>
#include <vtkPolyDataToImageStencil.h>
#include <vtkImageAppendComponents.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
namespace {
void CallbackFunction(vtkObject* caller, long unsigned int vtkNotUsed(eventId),
void* vtkNotUsed(clientData), void* vtkNotUsed(callData))
{
vtkImageTracerWidget* tracerWidget =
static_cast<vtkImageTracerWidget*>(caller);
vtkNew<vtkPolyData> path;
tracerWidget->GetPath(path);
std::cout << "There are " << path->GetNumberOfPoints()
<< " points in the path." << std::endl;
}
} // end anonymous namespace
void setColor(std::array<double, 3> &leftColor, std::array<double, 3> &rightColor)
{
vtkNew<vtkNamedColors> colors;
auto color1 = colors->GetColor3ub("SlateGray").GetData();
auto color2 = colors->GetColor3ub("Tomato").GetData();
for (auto i = 0; i < 3; ++i)
{
leftColor[i] = color1[i];
rightColor[i] = color2[i];
}
}
int main(int, char*[])
{
//std::array<double, 3> leftColor1{ 0, 0, 0 };
//std::array<double, 3> rightColor2{ 0, 0, 0 };
//
//setColor(leftColor1, rightColor2);
//vtkNew<vtkImageCanvasSource2D> imageSource;
//imageSource->SetScalarTypeToUnsignedChar();
//imageSource->SetNumberOfScalarComponents(3);
//imageSource->SetExtent(0, 20, 0, 50, 0, 0);
//imageSource->SetDrawColor(leftColor1.data());
//imageSource->FillBox(0, 20, 0, 50);
//imageSource->SetDrawColor(rightColor2.data());
//imageSource->FillBox(0, 10, 0, 30);
//imageSource->Update();
vtkSmartPointer<vtkImageCanvasSource2D> red =
vtkSmartPointer<vtkImageCanvasSource2D>::New();
red->SetScalarTypeToUnsignedChar();
red->SetNumberOfScalarComponents(1);
red->SetExtent(0, 100, 0, 100, 0, 0);
red->SetDrawColor(0, 0, 0, 0);
red->FillBox(0, 100, 0, 100);
red->SetDrawColor(255, 0, 0, 0);
red->FillBox(20, 40, 20, 40);
red->Update();
vtkSmartPointer<vtkImageCanvasSource2D> green =
vtkSmartPointer<vtkImageCanvasSource2D>::New();
green->SetScalarTypeToUnsignedChar();
green->SetNumberOfScalarComponents(1);
green->SetExtent(0, 100, 0, 100, 0, 0);
green->SetDrawColor(0, 0, 0, 0);
green->FillBox(0, 100, 0, 100);
green->SetDrawColor(255, 0, 0, 0);
green->FillBox(30, 50, 30, 50);
green->Update();
vtkSmartPointer<vtkImageCanvasSource2D> blue =
vtkSmartPointer<vtkImageCanvasSource2D>::New();
blue->SetScalarTypeToUnsignedChar();
blue->SetNumberOfScalarComponents(1);
blue->SetExtent(0, 100, 0, 100, 0, 0);
blue->SetDrawColor(0, 0, 0, 0);
blue->FillBox(0, 100, 0, 100);
blue->SetDrawColor(255, 0, 0, 0);
blue->FillBox(40, 60, 40, 60);
blue->Update();
vtkSmartPointer<vtkImageAppendComponents> appendFilter =
vtkSmartPointer<vtkImageAppendComponents>::New();
appendFilter->SetInputConnection(0, red->GetOutputPort());
appendFilter->AddInputConnection(0, green->GetOutputPort());
appendFilter->AddInputConnection(0, blue->GetOutputPort());
appendFilter->Update();
vtkNew<vtkImageActor> actor;
actor->GetMapper()->SetInputConnection(appendFilter->GetOutputPort());
vtkNew<vtkRenderer> renderer;
renderer->AddActor(actor);
renderer->ResetCamera();
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->AddRenderer(renderer);
renderWindow->SetWindowName("vtkImageTracerWidget");
vtkNew<vtkRenderWindowInteractor> interactor;
interactor->SetRenderWindow(renderWindow);
vtkNew<vtkInteractorStyleImage> style;
interactor->SetInteractorStyle(style);
vtkNew<vtkImageTracerWidget> tracer;
tracer->GetLineProperty()->SetLineWidth(5);
tracer->SetInteractor(interactor);
tracer->SetViewProp(actor);
renderWindow->Render();
// The observer must be added BEFORE the On() call.
vtkNew<vtkCallbackCommand> callback;
callback->SetCallback(CallbackFunction);
tracer->AddObserver(vtkCommand::EndInteractionEvent, callback);
tracer->On();
interactor->Initialize();
interactor->Start();
return EXIT_SUCCESS;
}
版权声明:本文为q610098308原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。