各位读者好,长期以来,我几乎没有在公众号和知乎平台上写图像处理的文章,因为我觉得,对研发类文章感兴趣的人很少。但最近从CSDN和微信上留言情况来看,或许事实不像我当时认为的那样糟糕。这类文章能帮助其他人,甚至在很长时间内都能被人阅读,它的价值应该被重视起来。
VTK是非常优秀的开源系统,专门用于三维计算机图像处理和可视化任务。本文讲解VTK开发环境的搭建和第一个可视化例子。
环境:
VTK-8.1.1
macOS Catalina 10.15
Python 2.7.10
下载和安装
先到官网下载这套软件系统:https://vtk.org/download
尽量下载最新的VTK版本到本地。VTK源码和相关的例子都使用CMake进行管理的,下面我们开始CMake配置。如果没有CMake,请先安装这个工具,同样地,安装最新版本。
有许多的选项需要设置,比如跨平台软件开发框架Qt,生成VTK库的安装地址。同时,你可能已经注意到一些算法例子使用了Python,所以我们也应该配置脚本语言Python和TCL的变量。关于并行计算的开发工具TBB我暂时不写,害怕东西太多,让人接受不了~ 咱们慢慢来。
也许很多人喜欢用CMake GUI配置,然而,我觉得shell脚本更加提升工作效率,一次写好,受益无穷。上脚本。
configure.sh
cmake ./ -G "Unix Makefiles" \
-DVTK_USE_QVTK:BOOL=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DVTK_USE_GUISUPPORT:BOOL=ON \
-DVTK_QT_VERSION=5 \
-DModule_vtkGUISupportQt:BOOL=ON \
-DModule_vtkGUISupportQtOpenGL:BOOL=ON \
-DModule_vtkGUISupportQtSQL:BOOL=ON \
-DModule_vtkGUISupportQtWebkit:BOOL=OFF \
-DModule_vtkRenderingQt:BOOL=ON \
-DModule_vtkViewsQt:BOOL=ON \
-DVTK_WRAP_TCL:BOOL=ON \
-DTK_INTERNAL_PATH:PATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers/tk-private \
-DVTK_WRAP_PYTHON:BOOL=ON \
-DVTK_PYTHON_VERSION=2.7.10 \
-DPYTHON_EXECUTABLE=/usr/bin/python \
-DPYTHON_INCLUDE_DIR=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/python2.7 \
-DQt5_DIR:PATH=/Users/weiyang/Downloads/Qt5.11.2/5.11.2/clang_64/lib/cmake/Qt5
编译安装VTK:
bash configure.sh
make
sudo make install
安装完成后,我们来写第一个例子,显示一个圆锥。
第一个例子
下面将展示C++、Python的不同demo版本。它们的思路是一样的,使用vtkConeSource创建源数据,构建mapper、actor显示数据,将actor加入renderer中,使得VTK pipeline正常工作。
C++ 版本
配置文件 CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(mytest)
find_package( VTK REQUIRED )
include( ${VTK_USE_FILE} )
add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries( ${PROJECT_NAME} ${VTK_LIBRARIES} )
main.cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define vtkSPtr vtkSmartPointer
#define vtkSPtrNew(Var, Type) vtkSPtr Var = vtkSPtr::New();
using namespace std;
int main(){
vtkSPtrNew( cone, vtkConeSource );
vtkSPtrNew( mapper, vtkPolyDataMapper );
mapper->SetInputConnection( cone->GetOutputPort() );
vtkSPtrNew( actor, vtkActor );
actor->SetMapper( mapper );
vtkSPtrNew( renderer, vtkRenderer );
renderer->AddActor(actor);
renderer->SetBackground( 0, 0, 0 );
vtkSPtrNew( renderWindow, vtkRenderWindow );
renderWindow->AddRenderer( renderer );
vtkSPtrNew( renderWindowInteractor, vtkRenderWindowInteractor );
renderWindowInteractor->SetRenderWindow( renderWindow );
renderer->ResetCamera();
renderWindow->Render();
renderWindowInteractor->Start();
return 0;
}
Python 版本
#!/usr/bin/env python
import vtk
cone = vtk.vtkConeSource()
coneMapper = vtk.vtkPolyDataMapper()
coneMapper.SetInputConnection( cone.GetOutputPort() )
coneActor = vtk.vtkActor()
coneActor.SetMapper( coneMapper )
ren1= vtk.vtkRenderer()
ren1.AddActor( coneActor )
ren1.SetBackground( 0, 0, 0 )
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer( ren1 )
renWinInteractor = vtk.vtkRenderWindowInteractor()
renWinInteractor.SetRenderWindow( renWin )
renWinInteractor.Start()
现在已有的code比较多了,为避免影响阅读体验,TCL版本代码我就不贴在本文中了。如果你还对Tcl的demo好奇,可以访问 VTK – A Simple Example Written In Tcl Script。
该写点儿人物故事了,毕竟编故事才是我的主业。