VTK 分割/配准类Widget vtkImageTracerWidget vtkImageContourWidget

  • 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版权协议,转载请附上原文出处链接和本声明。