3D Rascasting volume does not shown with Qt +vtk9.1.0

Viewed 29

I am trying to use Qt5.14.2 and vtk9.1.0 to show a 3D constructed model from my own data(CT), but the widget does not show up. If it is used to show a sphere model from vtk resources, it works. And I can confirm that the code of raycasting using vtk(NOT combined with Qt) worked correctly. could someone tell me what is going wrong?

--update

I changed the volume method as vtkOpenGLGPUVolumeRayCastMapper, and now it does not show rightly and it reminds me that:

This OpenGL implementation does not support the required texture size of 65536, falling back to maximum allowed, 32768.This may cause an incorrect lookup table mapping.

if I use vtkSmartVolumeMapper it just show nothing (no qt window, no console info in VS) after run the project with build successfully.

vtkOpenGLGPUVolumeRayCastMapper

qt_vtk_study_2::qt_vtk_study_2(QWidget* parent)
: QMainWindow(parent)

{ui.setupUi(this);
using namespace std;
QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

vtkNew<vtkNamedColors> colors;
vtkNew<vtkSphereSource> sphereSource;
vtkNew<vtkPolyDataMapper> sphereMapper;
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
vtkNew<vtkActor> sphereActor;
sphereActor->SetMapper(sphereMapper);
sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato"). GetData());
vtkNew<vtkRenderer> renderer;
//renderer->AddActor(sphereActor);
//renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());



std::string folder = "D:\\BrainData\\neurite-oasis.v1.0\\OASIS_OAS1_0001_MR1\\aligned_seg35.nii";
std::string lesion_path = "D:\\BaiduNetdiskDownload\\DongyingData\\labeloutput\\001_cheng_xiaoxiang.nii";
using PixelType = signed short;
const unsigned int  Dimension = 3;
typedef itk::Image<PixelType, Dimension> ImageType;//定义图像类型

using ImageIOTypeNII = itk::NiftiImageIO;
using ReaderTypeNII = itk::ImageFileReader< ImageType >;//定义一个imageReader类型

ReaderTypeNII::Pointer Reader = ReaderTypeNII::New();
ImageIOTypeNII::Pointer gNiftiImageIORead = ImageIOTypeNII::New();
Reader->SetImageIO(gNiftiImageIORead);
Reader->SetFileName(folder);//读取图像
Reader->Update();//将图像输出到流

//leison
ReaderTypeNII::Pointer Reader1 = ReaderTypeNII::New();
Reader1->SetImageIO(gNiftiImageIORead);
Reader1->SetFileName(lesion_path);//读取图像
Reader1->Update();//将图像输出到流

ImageType::Pointer image = ImageType::New();
ImageType::Pointer lesion_image = ImageType::New();//leison

typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
ConnectorType::Pointer connector = ConnectorType::New();
ConnectorType::Pointer lesion_connector = ConnectorType::New();//leison
connector->SetInput(Reader->GetOutput());
lesion_connector->SetInput(Reader1->GetOutput());//leison
try
{
    connector->Update();
    lesion_connector->Update();
}
catch (itk::ExceptionObject& e)
{
    std::cerr << "exception in file reader" << std::endl;
    std::cerr << e << std::endl;
    
}


//读取ct图像
//vtkSmartPointer<vtkNIFTIImageReader> reader = vtkSmartPointer<vtkNIFTIImageReader>::New();
//vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
//reader->SetDirectoryName(folder.c_str());
//reader->SetFileName(folder.c_str());
//reader->Update();

vtkSmartPointer<vtkSmartVolumeMapper> volumeMapper = vtkSmartPointer< vtkSmartVolumeMapper>::New();
vtkSmartPointer< vtkSmartVolumeMapper> lesion_volumeMapper = vtkSmartPointer< vtkSmartVolumeMapper>::New();//leison
volumeMapper->SetRequestedRenderModeToRayCast();
lesion_volumeMapper->SetRequestedRenderModeToRayCast();

volumeMapper->SetInputData(connector->GetOutput());
volumeMapper->SetBlendModeToComposite();
lesion_volumeMapper->SetInputData(lesion_connector->GetOutput());
lesion_volumeMapper->SetBlendModeToComposite();

vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
volumeProperty->SetInterpolationTypeToLinear();
volumeProperty->ShadeOn();//阴影开关,打开下面的设置才有效
volumeProperty->SetAmbient(0.4);//环境光系数
volumeProperty->SetDiffuse(0.6);  //漫反射
volumeProperty->SetSpecular(0.2); //镜面反射
vtkSmartPointer<vtkVolumeProperty> lesion_volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
lesion_volumeProperty->SetInterpolationTypeToLinear();
lesion_volumeProperty->ShadeOn();//阴影开关,打开下面的设置才有效
lesion_volumeProperty->SetAmbient(0.4);//环境光系数
lesion_volumeProperty->SetDiffuse(0.6);  //漫反射
lesion_volumeProperty->SetSpecular(0.2); //镜面反射

//设置不透明度
vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
vtkSmartPointer<vtkPiecewiseFunction> lesion_compositeOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
compositeOpacity->AddPoint(0, 0.0);
compositeOpacity->AddPoint(1, 0.00);
//compositeOpacity->AddPoint(2, 0.0);
compositeOpacity->AddPoint(21, 0.50);
compositeOpacity->AddPoint(23, 0.90);

lesion_compositeOpacity->AddPoint(0, 0.0);
lesion_compositeOpacity->AddPoint(1, 0.5);

volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数
lesion_volumeProperty->SetScalarOpacity(lesion_compositeOpacity);
////设置梯度不透明属性
//vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
//volumeGradientOpacity->AddPoint(10, 0.0);
//volumeGradientOpacity->AddPoint(70, 0.3);
//volumeGradientOpacity->AddPoint(90, 0.5);
//volumeGradientOpacity->AddPoint(500, 1.0);
//volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比

//设置颜色属性
vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New();
vtkSmartPointer<vtkColorTransferFunction> lesion_color = vtkSmartPointer<vtkColorTransferFunction>::New();
//color->AddRGBPoint(0, 1, 1, 1);

std::default_random_engine e;
std::uniform_real_distribution<double> u(0, 255);
e.seed(time(0));
for (int i = 1; i < 36; i++)
{
    color->AddRGBPoint(i, u(e) / 255.0, u(e) / 255.0, u(e) / 255.0);
}
lesion_color->AddRGBPoint(2, 205 / 255.0, 85 / 255.0, 85 / 255.0);
//color->AddRGBPoint(1, 250/255.0 ,235/255.0 ,215/255.0);
//color->AddRGBPoint(2, 255/ 255.0, 218 / 255.0, 185 / 255.0);
//color->AddRGBPoint(3, 255/ 255.0, 245 / 255.0, 238 / 255.0);
//color->AddRGBPoint(4, 245 / 255.0, 250 / 255.0, 250 / 255.0);
//color->AddRGBPoint(5, 255 / 255.0, 228 / 255.0, 225 / 255.0);
//color->AddRGBPoint(6, 47 / 255.0, 79 / 255.0, 79 / 255.0);
//color->AddRGBPoint(7, 112 / 255.0, 128 / 255.0, 144 / 255.0);
//color->AddRGBPoint(8, 190 / 255.0, 190 / 255.0, 190 / 255.0);
volumeProperty->SetColor(color);
lesion_volumeProperty->SetColor(lesion_color);

//类似Actor
vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
volume->Update();
vtkSmartPointer<vtkVolume> lesion_volume = vtkSmartPointer<vtkVolume>::New();
lesion_volume->SetMapper(lesion_volumeMapper);
lesion_volume->SetProperty(lesion_volumeProperty);
lesion_volume->Update();

//vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->SetBackground(93 / 255.0, 217 / 255.0, 230 / 255.0);
//renderer->AddVolume(volume);
//renderer->AddVolume(lesion_volume);
//renderer->AddActor(volume);
//renderer->AddActor(lesion_volume);
renderer->AddActor(sphereActor);//
//std::cout << renderer->GetActors()->GetNumberOfItems() << std::endl;
//vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New();
//rw->AddRenderer(renderer);


vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
renderWindow->SetGlobalMaximumNumberOfMultiSamples(0);
renderWindow->AddRenderer(renderer);
//renderWindow->SetWindowName("RenderWindowNoUIFile");
//setCentralWidget(ui.qvtkWidget);

//QVTKOpenGLNativeWidget *mq = new QVTKOpenGLNativeWidget(this);
ui.qvtkWidget->setRenderWindow(renderWindow);
}

enter image description here

0 Answers
Related