前言
最近在工作中涉及到3D 数据的分割,深度学习方法慢,且构建数据集费时费力,经过一番查找,最终选择使用ITK这个库。最开始的时候是使用python 环境下的SimpleITK ,也实现了我想要的功能。但最终要和QT C++ 的项目合并,所以只能使用C++ 下的代码了。后来因为速度上的问题,又编译了基于Cuda 11.2 的GPU 版本的ITK.
这里记录一下我在使用ITK 过程中遇到的坑和问题,希望能给后来人有些帮助。
环境
- windows10
- ITK-5.3.0
- VS 2019
- Cuda 11.2
- CMake 3.17.0-rc2
编译
安装VS2019 cmake,这个不多说了,然后下载ITK ,最开始的时候还编译过5.1这个版本,后来发下5.3 应该是有有些优化,速度上会更快,因此用了5.3。下载地址:https://github.com/InsightSoftwareConsortium/ITK/releases/download/v5.3.0/InsightToolkit-5.3.0.zip
然后用CMake 打开源码路径,并创建build路径,在cmake中选择。这里遇到我编译时的第一个坑。因为编译输出后是要调用的,所以需要输出dll,也就是需要buidl shared lib,我对cmake 也不是很熟悉,上了一看,是没有shared lib,以为是版本不行,又换了好几次版本。
经过摸索发现,需要点击这里就会出现shared lib 了,还是不熟悉导致的。差点因为这个花钱买别人的专栏看。
然后Configure 下
应该是没有啥问题,如果是有缺少文件,或者下载文件失败的问题就去下载相应的文件到对应的目录中。
如果要是编译GPU 版的话还需要选择GPU
编译完成后,打开项目,点击ALL_BUILD -> 生成,之后INSTALL ->生成,如果没改生成路径的话,最终会安装到 C:\Program Files (x86)\ITK 下
如果是调试阶段,可以在Debug 模式下编译,如果投入使用,建议还是Release,速度真的 不是快的一点半点啊(血的教训 =;=)。
测试
编译完成后就可以使用ITK了,因为不清楚哪些lib库和dll 库不需要,所有就把所有的库都加上了。
在VS2019 中引入头文件,和 所有的lib库(这里库太多,一个个添加太麻烦,使用了这个命令
dir /b *.lib > out.txt, 将所有lib 库的名输出到txt 中,然后复制过去)。
测试代码(来自官方文档):
#include "itkImage.h"
int main(int, char *[])
{
// 生成一个三维的数据,数据类型是 无符号16位整型
using ImageType = itk::Image<unsigned short, 3>;
auto image = ImageType::New();
ImageType::IndexType start;
start[0] = 0; // first index on X
start[1] = 0; // first index on Y
start[2] = 0; // first index on Z
ImageType::SizeType size;
size[0] = 200; // size along X
size[1] = 200; // size along Y
size[2] = 200; // size along Z
ImageType::RegionType region;
region.SetSize(size);
region.SetIndex(start);
image->SetRegions(region);
image->Allocate();
return EXIT_SUCCESS;
}
然后可能会遇到这样的问题:
“itk::ShapedNeighborhoodIterator<TImage,TBoundaryCondition>::ConstIterator”: 是非法基类“
itk::LabelMap<TLabelObject>::GetNthLabelObject”: 无法将函数定义与现有的声明匹配
我的做法是
将这几个头文件替换成为下面的 5.1版本头文件
然后在运行就不会报错了(当然我这个办法可能不对,如果有清楚的,欢迎指正)。
其他
最后我也编译了SimpleITK 这个库,最开始时,老是编译失败,后来在SimpITK 的GitHub 上找打了原因。是需要有版本对应的,simpleITK 2.2.0和ITK 5.3.0 是对应的,其他的版本不清楚,没有尝试过。编译方法和ITK 相差不大。
SimpleITK python 版挺好用的,C++就一般了,官方的列子少的可怜。最后到也是实现了需求,但文档确实不如ITK全面,官方页面也不提供全局搜索功能,吐槽下。