VTK+VS在三维图像上添加立方体标注----肺结节检测可视化

环境:vs2017+qt5+VTK9.1 

 实现代码:

在原图中调用创建立方体部分代码:

void vtk91test::test2()
{
	QElapsedTimer timer;
	timer.start();
	//=========================读取并渲染原mhd图像===============================
	//QVTKOpenGLNativeWidget 加入renderer
	vtkRenderer* render = vtkRenderer::New();
	widget->GetRenderWindow()->AddRenderer(render);

	vtkMetaImageReader* reader = vtkMetaImageReader::New();
	reader->SetFileName("1.mhd");
	reader->Update();

	vtkSmartPointer volumeMapper1 = 
		vtkSmartPointer::New();
	volumeMapper1->SetInputData(reader->GetOutput());
	volumeMapper1->SetBlendModeToComposite();

	vtkNew volumeProperty;
	volumeProperty->SetInterpolationTypeToLinear();
	volumeProperty->SetAmbient(0.4);
	volumeProperty->SetDiffuse(0.6);
	volumeProperty->SetSpecular(0.2);

	vtkNew compositeOpacity;
	compositeOpacity->AddPoint(70, 0.00);
	compositeOpacity->AddPoint(90, 0.40);
	compositeOpacity->AddPoint(180, 0.60);
	volumeProperty->SetScalarOpacity(compositeOpacity); //设置灰度不透明度传输函数
	//Gradient 斜率
	vtkNew volumeGradientOpacity;
	volumeGradientOpacity->AddPoint(10, 0.0);
	volumeGradientOpacity->AddPoint(90, 0.5);
	volumeGradientOpacity->AddPoint(100, 1.0);
	//volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比
	//设置颜色传输函数
	vtkNew color;
	color->AddRGBPoint(0.000, 0.00, 0.00, 0.00);
	color->AddRGBPoint(64.00, 1.00, 0.52, 0.30);
	color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);
	color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);
	volumeProperty->SetColor(color);
	//相当于二维的vtkActor
	vtkNew volume0;
	volume0->SetMapper(volumeMapper1);
	volume0->SetProperty(volumeProperty);
	//==============加入立方体标注======================
	//设置坐标
	int maxX = 100;
	int maxY = 100;
	int maxZ = 100;
	int minX = 10;
	int minY = 10;
	int minZ = 10;
	QVector vector;
	vector.append(maxX);
	vector.append(maxY);
	vector.append(maxZ);
	vector.append(minX);
	vector.append(minY);
	vector.append(minZ);
	//调用添加标注函数
	vtkSmartPointer rectangleActor = vtkSmartPointer::New();
	rectangleActor = this->addRectangle3D(vector, 3, "Red");
	render->AddVolume(volume0);
	render->AddActor(rectangleActor);
	qDebug() << "render time :" << timer.elapsed();
	widget->GetInteractor()->Render();
	qDebug() << "end time :" << timer.elapsed();

	qDebug() << "test2=================";

}

创建立方体部分代码: 

首先定义立方体的8个顶点,通过8个顶点创建出12条线段。

其中这段代码比较难理解,我的理解是通过这两行创建一个线段,线段的第一个顶点是Points中的第i个点,第一个顶点式Points中的第(i + 1) % 4 != 0 ? (i + 1) : 0)个点。

boxGridCell->GetPointIds()->SetId(0, i);//0,1   0,2  0,3  
boxGridCell->GetPointIds()->SetId(1, ((i + 1) % 4 != 0 ? (i + 1) : 0));

然后将其12个线段装入CellArray中进行渲染。 

 实验结果:

VTK+VS在三维图像上添加立方体标注----肺结节检测可视化_第1张图片

 标注的立方体可以随原图移动,变换大小。

你可能感兴趣的:(vtk,vs2017+Qt5,c++,qt)