本来没有打算经营博客,但是无奈公司倒闭,所有人都被裁,现在工作难找,赋闲在家,看看能不能整理一下之前做过的功能来谋取一点点生活费,如果我的文章能帮助到各位,节省大家的时间和精力也是好的。废话不多说了,进入正文。
切割的种类
- 矩形切割
- 平面切割
- 曲线切割(本文主要是讲这个)
- 曲面切割(我其他的文章有这个介绍)
曲线切割
曲线切割可以切割体绘制,可以切割面绘制,两者切割的数据不一样,所以切割的算法也不一样,切割体绘制主要是对图像数据的处理,切割面绘制主要是对面片的处理,本文主要是讲解体绘制的切割,面绘制的切割可以看我其他的文章。
曲线切割的效果
看视频是不是自己想要的效果,需求确定了,功能完成才不会出错。
这部分是之前使用的功能,我将功能单独做成了小Demo,方便阅读和使用。
之前的演示:
完美分割线
这个是Demo的演示,图像做了中间等待删除帧处理,速度取决图像的大小和类型。
主要代码
代码主要是Qt+VTK,主要的部分就是切割的部分:
思路是我们提取曲线的多边形数据转换为一个图像模板,然后使用这个模板来创建一个新的图像,其中模板内部的像素值被设置为 0,外部的像素值被设置为 255,通过这个模板图像来设置我们的原始图像数据。
vtkSmartPointer<vtkPolyDataToImageStencil> BrushPolyDataToStencil = vtkSmartPointer<vtkPolyDataToImageStencil>::New();
BrushPolyDataToStencil->SetOutputSpacing(spacing[0], spacing[1], spacing[2]);
BrushPolyDataToStencil->SetInputData(transformFilter->GetOutput());
BrushPolyDataToStencil->SetOutputWholeExtent(Mask->GetExtent());
BrushPolyDataToStencil->SetOutputOrigin(Mask->GetOrigin());
BrushPolyDataToStencil->Update();
vtkImageStencilData* stencilData = BrushPolyDataToStencil->GetOutput();
int stencilExtent[6] = { 0, -1, 0, -1, 0, -1 };
stencilData->GetExtent(stencilExtent);
vtkSmartPointer<vtkImageStencilToImage> stencilToImage = vtkSmartPointer<vtkImageStencilToImage>::New();
stencilToImage->SetInputData(BrushPolyDataToStencil->GetOutput());
stencilToImage->SetInsideValue(0);
stencilToImage->SetOutsideValue(255);
stencilToImage->SetOutputScalarType(VTK_UNSIGNED_CHAR);
stencilToImage->Update();
完整工程
为了避免伸手党只是张要代码,也是为了尊重自己的劳动成果,完整的工程需要支付一些费用,本工程只允许学习使用,不允许分享,还希望理解,支付并使用代码即认为接受。以下是完整工程连接,需要自己修改工程依赖,vtk使用的是8.2的版本。
暂时没有上传到优快云,不知道如何设置。
感兴趣的朋友点击拍下。