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<vtkGPUVolumeRayCastMapper> volumeMapper1 = 
		vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
	volumeMapper1->SetInputData(reader->GetOutput());
	volumeMapper1->SetBlendModeToComposite();

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

	vtkNew<vtkPiecewiseFunction> compositeOpacity;
	compositeOpacity->AddPoint(70, 0.00);
	compositeOpacity->AddPoint(90, 0.40);
	compositeOpacity->AddPoint(180, 0.60);
	volumeProperty->SetScalarOpacity(compositeOpacity); //设置灰度不透明度传输函数
	//Gradient 斜率
	vtkNew<vtkPiecewiseFunction> volumeGradientOpacity;
	volumeGradientOpacity->AddPoint(10, 0.0);
	volumeGradientOpacity->AddPoint(90, 0.5);
	volumeGradientOpacity->AddPoint(100, 1.0);
	//volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比
	//设置颜色传输函数
	vtkNew<vtkColorTransferFunction> 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<vtkVolume> 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<int> vector;
	vector.append(maxX);
	vector.append(maxY);
	vector.append(maxZ);
	vector.append(minX);
	vector.append(minY);
	vector.append(minZ);
	//调用添加标注函数
	vtkSmartPointer<vtkActor> rectangleActor = vtkSmartPointer<vtkActor>::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中进行渲染。 

 实验结果:

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值