VTK三维重建+鼠标响应实时刷新跟踪点

//移动立方体2

#include "vtkDICOMImageReader.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkMarchingCubes.h"
#include "vtkStripper.h"
#include "vtkActor.h"
#include "vtkPolyDataMapper.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkBoxWidget.h"
//---------------------------//
#include <iostream>
#include <vector>
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkPoints.h"
#include "vtkPolyVertex.h"
#include "vtkUnstructuredGrid.h"
#include "vtkDataSetMapper.h"
#include "vtkPolyData.h"
#include "vtkCellArray.h"
#include "vtkInteractorStyleTrackball.h"
#include "vtkPolyDataMapper.h"
//--------------------------//
#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkStructuredPoints.h>
#include <vtkStructuredPointsReader.h>
#include <vtkVolumeTextureMapper3D.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkVolumeProperty.h>
#include <vtkAxesActor.h>
#include <vtkImageShiftScale.h>
#include <vtkImageCast.h>
//---------------------------//
#include <iostream>

//-------------回调--------------//
#include <vtkRenderWindowInteractor.h>
#include <vtkCallbackCommand.h>
//-----------------------------//
long pressCounts = 0;
//vtkSmartPointer<vtkPoints> m_Points = vtkSmartPointer<vtkPoints>::New();
//vtkSmartPointer<vtkCellArray> vertices =vtkSmartPointer<vtkCellArray>::New();   //_存放细胞顶点,用于渲染(显示点云所必须的)
//vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
//vtkSmartPointer<vtkPolyDataMapper> pointMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
//vtkSmartPointer<vtkActor> pointActor = vtkSmartPointer<vtkActor>::New();
//
//vtkRenderWindow *renWin = vtkRenderWindow::New();
//第一步,定义回调函数。注意回调函数的签名,不能更改。
//	void MyCallbackFunc(vtkObject*, unsigned long eid, void* clientdata, void *calldata)
//{
//	std::cout<<"You have clicked: "<<++pressCounts<<" times."<<std::endl;
//	//m_Points->SetPoint(0, 0, 600, pressCounts*5);    //更新顶点坐标
//	//m_Points->Modified();
//	//renWin->Render();
//	//iren->GetRenderWindow()->Render();
//}
//第一步
//class vtkMyCommand : public vtkCommand
//{
//public:
//    static vtkMyCommand *New()
//    {
//        return new vtkMyCommand;
//    }
//
//    void SetObject(vtkPoints* Points)
//    {
//        n_Points = Points;
//    }
//
//    virtual void Execute(vtkObject *caller, unsigned long eventId, void* callData)
//    {
//	std::cout<<"You have clicked: "<<++pressCounts<<" times."<<std::endl;
//	m_Points->SetPoint(0, 0, 600, pressCounts*5);    //更新顶点坐标
//	m_Points->Modified();
//		renWin->Render();
//    }
//
//private:
//    vtkPoints* n_Points;
//};

=====================================================//
	class ShowPointCallback : public vtkCommand
{
public:
	static ShowPointCallback *New() //回调函数初始化函数
	{
		return new ShowPointCallback;
	}
	ShowPointCallback()
	{
		this->M_Points=0;
		this->Interactor = 0;
	}

	 void SetPoints(vtkPoints * Points)
	 {
		 this->M_Points = Points;
	 }

	 vtkPoints *GetPoints()
	 {
		 return this->M_Points;
	 }
	 
	void SetInteractor(vtkRenderWindowInteractor *interactor)
	{
		this->Interactor = interactor;
	}
	vtkRenderWindowInteractor *GetInteractor()
	{
		return  this->Interactor;
	}
	
	
	virtual void Execute(vtkObject * ,unsigned long event,void *)
	{
		
				std::cout<<"You have clicked: "<<++pressCounts<<" times."<<std::endl;
				
				vtkPoints * new_Points =GetPoints();
				new_Points->SetPoint(0, 0, 600, pressCounts*5);
				new_Points->Modified();
				
				vtkRenderWindowInteractor *interactor = GetInteractor();
				interactor->Render();
	}
private:
	//int Slicing;
	//vtkImageReslice *ImageReslice;
	vtkRenderWindowInteractor *Interactor;
	vtkPoints * M_Points;
};
//**********************************************************************************//
int main() 
{

	vtkDICOMImageReader   *reader =  vtkDICOMImageReader::New();
	reader->SetDataByteOrderToLittleEndian();//设置图像数据的字端序转换成小字端序
	reader->SetDirectoryName("D://DicomImages/SE0/");
	reader->SetDataSpacing(1.0,1.0,0.48);//设置图像像素间距和序列间距

	//抽取等值面为骨头的信息
	vtkMarchingCubes *boneExtractor = vtkMarchingCubes::New();
	boneExtractor->SetInputConnection(reader->GetOutputPort());
	boneExtractor->SetValue(0,-500); //设置提取的等值信息
	//boneExtractor->SetValue(1,333);


	//剔除旧的或废除的数据单元,提高绘制速度
	vtkStripper *boneStripper = vtkStripper::New(); //三角带连接
	boneStripper->SetInputConnection(boneExtractor->GetOutputPort());


	//建立映射
	vtkPolyDataMapper *boneMapper = vtkPolyDataMapper::New();
	boneMapper->SetInput(boneStripper->GetOutput());
	boneMapper->ScalarVisibilityOff(); 

//---------------------面2====================//
	//抽取等值面为骨头的信息
	vtkMarchingCubes *boneExtractor2 = vtkMarchingCubes::New();
	boneExtractor2->SetInputConnection(reader->GetOutputPort());
	//boneExtractor->SetValue(0,-500); //设置提取的等值信息
	boneExtractor2->SetValue(0,333);


	//剔除旧的或废除的数据单元,提高绘制速度
	vtkStripper *boneStripper2 = vtkStripper::New(); //三角带连接
	boneStripper2->SetInputConnection(boneExtractor2->GetOutputPort());


	//建立映射
	vtkPolyDataMapper *boneMapper2 = vtkPolyDataMapper::New();
	boneMapper2->SetInput(boneStripper2->GetOutput());
	boneMapper2->ScalarVisibilityOff(); 
	//建立角色
	vtkActor *bone2 = vtkActor::New();
	bone2->SetMapper(boneMapper2);


	bone2->GetProperty()->SetDiffuseColor(255,0,255);//(.1,.94,.52);
	bone2->GetProperty()->SetSpecular(1);
	bone2->GetProperty()->SetSpecularPower(20);
	bone2->GetProperty()->SetOpacity(0.2) ;
//---------------------------------------//
	//---------------------面3====================//
	//抽取等值面为骨头的信息
	vtkMarchingCubes *boneExtractor3 = vtkMarchingCubes::New();
	boneExtractor3->SetInputConnection(reader->GetOutputPort());
	//boneExtractor->SetValue(0,-500); //设置提取的等值信息
	boneExtractor3->SetValue(0,750);


	//剔除旧的或废除的数据单元,提高绘制速度
	vtkStripper *boneStripper3 = vtkStripper::New(); //三角带连接
	boneStripper3->SetInputConnection(boneExtractor3->GetOutputPort());


	//建立映射
	vtkPolyDataMapper *boneMapper3 = vtkPolyDataMapper::New();
	boneMapper3->SetInput(boneStripper3->GetOutput());
	boneMapper3->ScalarVisibilityOff(); 
	//建立角色
	vtkActor *bone3 = vtkActor::New();
	bone3->SetMapper(boneMapper3);


	bone3->GetProperty()->SetDiffuseColor(0,0,255);//(.1,.94,.52);
	bone3->GetProperty()->SetSpecular(0.6);
	bone3->GetProperty()->SetSpecularPower(20);
	bone3->GetProperty()->SetOpacity(0.2) ;
//---------------------------------------//
//--------------------添加点云---------------------------//
	//声明设为全局
vtkSmartPointer<vtkPoints> m_Points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkCellArray> vertices =vtkSmartPointer<vtkCellArray>::New();   //_存放细胞顶点,用于渲染(显示点云所必须的)
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPolyDataMapper> pointMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> pointActor = vtkSmartPointer<vtkActor>::New();

m_Points->InsertPoint(0,150,150,150);
vertices->InsertNextCell(1);     //_加入细胞顶点信息----用于渲染点集
vertices->InsertCellPoint(0);
//_创建待显示数据源
polyData->SetPoints(m_Points);       //_设置点集
polyData->SetVerts(vertices);        //_设置渲染顶点
pointMapper->SetInput( polyData );
pointActor->SetMapper( pointMapper );
pointActor->GetProperty()->SetColor(0.0,1.0,0.0);
pointActor->GetProperty()->SetAmbient(0.8);
pointActor->GetProperty()->SetPointSize(8);
//------------------------------------------------------//
	//建立角色
	vtkActor *bone = vtkActor::New();
	bone->SetMapper(boneMapper);


	bone->GetProperty()->SetDiffuseColor(1,1,1);//(.1,.94,.52);
	bone->GetProperty()->SetSpecular(.3);
	bone->GetProperty()->SetSpecularPower(20);
	bone->GetProperty()->SetOpacity(0.2) ;

	//标准句子
	//定义绘制器
	vtkRenderer *aRenderer = vtkRenderer::New();
	//定义绘制窗口
	vtkRenderWindow *renWin = vtkRenderWindow::New();//声明设为全局
	renWin->AddRenderer(aRenderer);
	renWin->SetSize(600,600) ;
				//第二步,设置回调函数。
						/*vtkSmartPointer<vtkCallbackCommand> mouseCallback = 
							vtkSmartPointer<vtkCallbackCommand>::New();
						mouseCallback->SetCallback ( MyCallbackFunc );*/
				 //第二步
					/*vtkSmartPointer<vtkMyCommand> callback = vtkSmartPointer<vtkMyCommand>::New();
					callback->SetObject(m_Points);
*/
	//定义窗口交互器
	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(renWin);
				
						//第三步,将vtkCallbackCommand对象添加到观察者列表。
				//iren->SetRenderWindow(polyData->GetRenderWindow());
				/*iren->AddObserver(vtkCommand::LeftButtonPressEvent, mouseCallback);*/
				//interactor->Initialize();
				///interactor->Start();
						/*iren->AddObserver(vtkCommand::LeftButtonPressEvent, callback);*/

	//创建一个camera
	vtkCamera *aCamera = vtkCamera::New();
	aCamera->SetViewUp(0,0,-1);
	aCamera->SetPosition(0,1,0);
	aCamera->SetFocalPoint(0,0,0);


	aRenderer->AddActor(bone);
	aRenderer->AddActor(bone2);
	aRenderer->AddActor(bone3);
	aRenderer->AddActor(pointActor);

	aRenderer->SetActiveCamera(aCamera);
	aRenderer->ResetCamera();
	aCamera->Dolly(1.5);
	aRenderer->SetBackground(0,0,0);
	aRenderer->ResetCameraClippingRange();


	//vtkBoxWidget *boxWidget = vtkBoxWidget::New();
	//boxWidget->SetInteractor(iren);
	//boxWidget->SetPlaceFactor(1.25);

//
	//boxWidget->SetProp3D(bone);
	//boxWidget->PlaceWidget();


	iren->Initialize();
		//****************建立 观察者-命令 模式****************//
	vtkSmartPointer<ShowPointCallback> callback =
		vtkSmartPointer<ShowPointCallback>::New();
	callback->SetPoints(m_Points);
	callback->SetInteractor(iren);
 
	iren->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
 
	//iren->Start();
	//-------------------------------------------------------//
	iren->Start();
	
	//m_Points->SetPoint(0, 0, 600, 0);    //更新顶点坐标
	//m_Points->Modified();
	renWin->Render();
	//iren->GetRenderWindow()->Render();
	reader->Delete();
	iren->Delete();
	return 0;
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源介绍】 基于Qt和VTK实现CT三维重建项目c++源码+项目说明.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 项目进度记录 1、解决了内存问题 2、从切片上拾取并计算在三维空间中的坐标 3、三维标记 4、三维空间的增删,设计测量模式的UI 5、添加了表格的数据增删 6、调试二次加载的BUG(添加重置功能) 7、裁剪功能的图像导入与滑条索引 8、优化:测量数据不可编辑 9、路径编码问题 10、实现裁剪功能(需要OpenCV) 11、增加导出裁剪图像时显示进度条的功能,由于VTK图像读取在内部完成,实现进度条功能相对复杂,暂未实现。 12、裸数据(二进制)裁剪 13、三维切面默认不显示 14、背景默认为黑色 15、bin文件读取增加自动读取config文件,确定宽高参数 16、裁剪后可直接读入到三维体绘制中,仍保留裁剪后保存的功能 17、三维体绘制的切面改为半透明 18、经测试,裁剪后读入(内存读入)出现了内存泄漏的问题,获取每一层的指针,解决了这个问题 19、解决进度条出现了假死的情况 20、解决选择文件夹为空的崩溃问题 21、实现对话框裁剪序列图像 22、在MainWindow中声明CropSequenceDialog为友元类,CropSequenceDialog则可以直接访问MainWindow的成员(包括私有)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值