记录自己的VTK学习之路——001
简单使用qt框架调用vtk库以显示图片,我用的是qt5.12.12,vtk9.3版本,编译过程大概借鉴了Qt&Vtk-001-编译,大致过程跟这篇文章一样,不过我编译的是9.3,并且因为我电脑上有好几个Qt版本,所以还是手动选了下,其他的都差不多。
编译好的库文件等指路:
https://github.com/a2218922710/LibVtk_win32-msvc2019
一、链接库文件
由于库文件太多了,我就大致放一下哈。
INCLUDEPATH += E:\mySpace\VTK_bin\include\vtk-9.3
LIBS += -LE:/mySpace/VTK_bin/lib/ -lvtkChartsCore-9.3 \
-lvtkWrappingTools-9.3 \
-lvtksys-9.3 \
-lvtkloguru-9.3 \
-lvtkCommonCore-9.3 \
-lvtkkissfft-9.3 \
-lvtkCommonMath-9.3 \
-lvtkCommonTransforms-9.3 \
-lvtkCommonMisc-9.3 \
-lvtkCommonSystem-9.3 \
-lvtkpugixml-9.3 \
...
...
二、使用
1.引入库
使用方法的话,如果只显示图片还是比较简单的。
代码如下(示例):
void MainWindow::SetReaderImage(const QString &imagePath)
{
QFileInfo imageFileInfo(imagePath);
vtkSmartPointer<vtkImageReader2> render;
int imageWindow = 0;
if("jpg" == imageFileInfo.suffix().toLower()
|| "jpeg" == imageFileInfo.suffix().toLower()) {
render = vtkSmartPointer<vtkJPEGReader>::New();
imageWindow = 0;
}else if("png" == imageFileInfo.suffix().toLower()) {
render = vtkSmartPointer<vtkPNGReader>::New();
imageWindow = 1;
}else if("bmp" == imageFileInfo.suffix().toLower()) {
render = vtkSmartPointer<vtkBMPReader>::New();
imageWindow = 2;
}else if("tif" == imageFileInfo.suffix().toLower()
|| "tiff" == imageFileInfo.suffix().toLower()) {
render = vtkSmartPointer<vtkTIFFReader>::New();
imageWindow = 3;
}else if("dcm" == imageFileInfo.suffix().toLower()) {
render = vtkSmartPointer<vtkDICOMImageReader>::New();
imageWindow = 4;
}else if("png" == imageFileInfo.suffix().toLower()) {
render = vtkSmartPointer<vtkPNGReader>::New();
imageWindow = 5;
}
/**
* @brief 读取本地图片
* 1. 获取本地资源地址
* 2. 新建渲染对象
* 3. 设置图像名称
* 4. 更新
*/
render -> SetFileName(imagePath.toUtf8());
render -> Update();
/**
* @brief 设置图片视图
* 1. 新建视图
* 2. 设置视图输入
* 3. 设置视图窗口
* 4. 视图渲染
*/
vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New();
viewer -> SetInputData(render -> GetOutput());
switch (imageWindow) {
case 0:
viewer -> SetRenderWindow(ui->widget->renderWindow());
break;
case 1:
viewer -> SetRenderWindow(ui->widget_2->renderWindow());
break;
case 2:
viewer -> SetRenderWindow(ui->widget_3->renderWindow());
break;
case 3:
viewer -> SetRenderWindow(ui->widget_4->renderWindow());
break;
case 4:
viewer -> SetRenderWindow(ui->widget_5->renderWindow());
break;
case 5:
viewer -> SetRenderWindow(ui->widget_6->renderWindow());
break;
default:
break;
}
viewer->GetRenderer()->SetBackground(.3, .6, .3); //背景色改变为绿色
viewer -> Render();
}
void MainWindow::DrawVtkCube()
{
vtkNew <vtkNamedColors> colors;
std::array<std::array<double, 3>, 8> pts = {{{{0, 0, 0}},
{{0.2, 0, 0}},
{{0.2, 0.2, 0}},
{{0, 0.2, 0}},
{{0, 0, 0.2}},
{{0.2, 0, 0.2}},
{{0.2, 0.2, 0.2}},
{{0, 0.2, 0.2}}}};
std::array<std::array<vtkIdType,4>,6> ording = {{{{0, 1, 2, 3}},
{{4, 5, 6, 7}},
{{0, 1, 5, 4}},
{{1, 2, 6, 5}},
{{2, 3, 7, 6}},
{{3, 0, 4, 7}}}};
vtkNew <vtkPolyData> cube;
vtkNew <vtkPoints> points;
vtkNew <vtkCellArray> polys;
vtkNew <vtkFloatArray> scalars;
for (auto i = 0ul;i < pts.size();++i)
{
points -> InsertPoint(i,pts[i].data());
scalars -> InsertTuple1(i,i);
}
for (auto &&i : ording)
polys -> InsertNextCell(vtkIdType(i.size()),i.data());
cube -> SetPoints(points);
cube -> SetPolys(polys);
cube -> GetPointData() -> SetScalars(scalars);
vtkNew<vtkPolyDataMapper> cubeMapper;
cubeMapper->SetInputData(cube);
cubeMapper->SetScalarRange(cube->GetScalarRange());
vtkNew<vtkActor> cubeActor;
cubeActor->SetMapper(cubeMapper);
vtkNew<vtkCamera> camera;
camera->SetPosition(1, 1, 1);
camera->SetFocalPoint(0, 0, 0);
vtkNew<vtkRenderer> render;
render -> AddActor(cubeActor);
render -> SetActiveCamera(camera);
render -> SetBackground(colors -> GetColor3d("Cornsilk").GetData());
ui->widget_6->renderWindow()->AddRenderer(render);
}
2.效果
3.测试代码指路
https://github.com/a2218922710/VTK_Test_001
总结
本文只是记录自己学习VTK的路线,也不知道可以坚持到哪里,仅仅是记录一下激励自己。
琢磨了一早上,因为自己蠢逼操作所以效果总是出不来,例如总是提示‘QWidget: Must construct a QApplication before a QWidget 请按任意键继续. . .’,找了一些文章,说是在创建QWidget之前创建QApplication,我承认他们说的有道理但是这不是我的问题原因,我的原因是编译时候编译的是release,但是我的qt程序是debug导致,极其蠢逼- -.。
还有不清楚为什么放在资源文件里面的图片不可以显示,希望各位大佬指点一下。
本文借鉴了很多前辈文章,指路->QWidget: Must construct a QApplication before a QWidget 请按任意键继续. . .
Qt&Vtk-002-第一个VtkQt程序