[VTK]基于VTK的三维重建

https://www.cnblogs.com/dawnWind/archive/2013/02/17/3D_06.html

0. Background

很久很久以前记录了一下使用WPF进行三维重建的一些探索,后来了解到了VTK这个开发包,

觉得功能很强大,因此后续都在基于VTK进行三维重建,在前文中对于VTK的一些相关网站进行了介绍

http://www.cnblogs.com/dawnWind/archive/2013/01/14/3D_04.html

这里就不再累赘了,感兴趣的Google一下即可。

对于VTK感兴趣的还可能会认识到与之相关的几个开发包。

其一是ITK:http://www.itk.org/

ITK始于著名的(VHP)Visible Human Project

http://www.nlm.nih.gov/research/visible/visible_gallery.html

简要地说VHP就是使用现代技术使用医学扫描等方式(如X光、CT、CMR等)获得人体二维图片,并根据这些图片构建出三维模型,

当然这里说要求的精度以及细度都非常高。人体的三维模型在我们头脑中可能立马会闪现很多电影里面有的场景,

一个组织脉络都清晰可见的人体呈现在我们面前。可以说在那个时代美国提出的这一科技项目不仅是高屋建瓴实际上

也给后续相关技术的发展带来了巨大的推动。

不过ITK说关注的更多是三维数据的测量、切割等,如果要进行三维呈现通常可以和VTK进行协作,这两者之间的数据

互通也很方便。不过对于ITK的了解我也就到此为止,并没有安装并使用过。

国内对于ITK、VTK开发包类似的研究主要由田捷带领开发的MITK,它整合ITK、VTK,为了达到一致简洁的开发,主要针对的领域是医学处理。

背景知识就这么多,接下来说一下使用VTK进行三维重建的基本步骤。

1. 3D Reconstruction with VTK

先上码。

 // 读取文件夹下图片,将图像进行轮廓提取后再进行三维重建
int build3DViewFull()
{
    vtkSmartPointer<vtkRenderer> aRenderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
    renWin->AddRenderer(aRenderer);

    vtkSmartPointer<vtkRenderWindowInteractor> iren =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    iren->SetRenderWindow(renWin);

    // 新建文件读取对象,常见的有vtkBMPReader、vtkDICOMImageReader、vtkJPEGReader等
    vtkSmartPointer<vtkJPEGReader> jpegReader =
        vtkSmartPointer<vtkJPEGReader>::New();
    // 不同的reader需要设置的参数是不同的 因此本例仅适合jpegreader
    jpegReader->SetFilePrefix("C:/Users/DawnWind/Desktop/000/"); // 要打开的路径
    jpegReader->SetFilePattern("%s%d.jpg"); // 图片文件名格式,此处为 0.jpg 1.jpg ...
    jpegReader->SetDataByteOrderToLittleEndian();
    jpegReader->SetDataSpacing(1, 1, 1.4);  // 设置图片中像素比,我理解得不清楚,具体请百度之
    jpegReader->SetFileNameSliceSpacing(1); 

    jpegReader->SetDataExtent(0, 209, 0, 209, 0, 29);
    // 这里因为在000文件夹里面有0.jpg ~ 29.jpg,所以设置为 0,29
    // 每张图片的长宽为210 * 210 因此设置为0,209

    jpegReader->Update();
    // update这里要注意一下,对于VTK在默认情况下是在最后操作时候才一次性刷新
    // 也就是说如果没有自动刷新的话,在一些中间过程中是无法获得到数据的,因为没update进去

    vtkSmartPointer<vtkContourFilter> skinExtractor =
        vtkSmartPointer<vtkContourFilter>::New();
    skinExtractor->SetInputConnection(jpegReader->GetOutputPort());
    skinExtractor->SetValue(200, 100);    //值越大,保留的部分越少。

    //重新计算法向量
    vtkSmartPointer<vtkPolyDataNormals> skinNormals =
        vtkSmartPointer<vtkPolyDataNormals>::New();
    skinNormals->SetInputConnection(skinExtractor->GetOutputPort());
    skinNormals->SetFeatureAngle(60.0);
    //Specify the angle that defines a sharp edge.
    //If the difference in angle across neighboring polygons is greater than this value,
    //the shared edge is considered "sharp". 

    //create triangle strips and/or poly-lines 为了更快的显示速度
    vtkSmartPointer<vtkStripper> skinStripper =
        vtkSmartPointer<vtkStripper>::New();
    skinStripper->SetInputConnection(skinNormals->GetOutputPort()); 

    vtkSmartPointer<vtkPolyDataMapper> skinMapper =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    skinMapper->SetInputConnection(skinStripper->GetOutputPort());
    skinMapper->ScalarVisibilityOff();    //这样不会带颜色

    vtkSmartPointer<vtkActor> skin =
        vtkSmartPointer<vtkActor>::New();
    skin->SetMapper(skinMapper); 

    // An outline provides context around the data.
    // 一个围绕在物体的立体框,可以先忽略
    /*
    vtkSmartPointer<vtkOutlineFilter> outlineData =
        vtkSmartPointer<vtkOutlineFilter>::New();
    outlineData->SetInputConnection(dicomReader->GetOutputPort());

    vtkSmartPointer<vtkPolyDataMapper> mapOutline =
        vtkSmartPointer<vtkPolyDataMapper>::New();
    mapOutline->SetInputConnection(outlineData->GetOutputPort());

    vtkSmartPointer<vtkActor> outline =
        vtkSmartPointer<vtkActor>::New();
    outline->SetMapper(mapOutline);
    outline->GetProperty()->SetColor(0,0,0);

    aRenderer->AddActor(outline);
    */
    // It is convenient to create an initial view of the data. The FocalPoint
    // and Position form a vector direction. Later on (ResetCamera() method)
    // this vector is used to position the camera to look at the data in
    // this direction.
    vtkSmartPointer<vtkCamera> aCamera =
        vtkSmartPointer<vtkCamera>::New();
    aCamera->SetViewUp (0, 0, -1);
    aCamera->SetPosition (0, 1, 0);
    aCamera->SetFocalPoint (0, 0, 0);
    aCamera->ComputeViewPlaneNormal();
    aCamera->Azimuth(30.0);
    aCamera->Elevation(30.0);

    // Actors are added to the renderer. An initial camera view is created.
    // The Dolly() method moves the camera towards the FocalPoint,
    // thereby enlarging the image.
    aRenderer->AddActor(skin);
    aRenderer->SetActiveCamera(aCamera);
    aRenderer->ResetCamera ();
    aCamera->Dolly(1.5);

    // Set a background color for the renderer and set the size of the
    // render window (expressed in pixels).
    aRenderer->SetBackground(.2, .3, .4);
    renWin->SetSize(640, 480);

    // Note that when camera movement occurs (as it does in the Dolly()
    // method), the clipping planes often need adjusting. Clipping planes
    // consist of two planes: near and far along the view direction. The
    // near plane clips out objects in front of the plane; the far plane
    // clips out objects behind the plane. This way only what is drawn
    // between the planes is actually rendered.
    aRenderer->ResetCameraClippingRange ();

    // Initialize the event loop and then start it.
    iren->Initialize();
    iren->Start();
    return 0;
}

通过上面代码的可以看出,对于一个三维重建是有一些必须步骤要走的。

一是要有输入源(上文中是reader读入的数据)通过处理构成的模型actor、二是要有相机(camera)、三要有用于展示的窗口(window)

其他的就是将其中的脉络理清了,可以仿照上面代码所述进行理解,具体理论可以去查找一下OpenGL的三维模型结构,其实与我前面说的

WPF三维模型相关理论是相通的。

可以获得类似下图结果:

号外:关于VTK的设置之类就没有多说了,假设大家已经可以运行VTK的示例

原文地址:https://www.cnblogs.com/jukan/p/9036476.html

时间: 2024-11-06 09:42:19

[VTK]基于VTK的三维重建的相关文章

基于OpenCV做“三维重建”(1)--找到并绘制棋盘

<OpenCV计算机视觉编程攻略(第3版)>这套书已经出到第3版了,如果你非要我说这本书有多好,我说不出来:只是很多我第一手的例子都是来源于这本书的-相比较OpenCV官方提供的代码,这本书的例子提供了更好的帮助.所以说这里我还将继续这个工作,将来我自己出书的时候这种模式也是可选的.      这里我要做的是第11章,关于3维重建的相关内容.[读书,做例子,多么轻松的学生岁月--] 例子11.2.1 获得图片的角点并且绘制出来. // GOCVHelper.cpp : 定义控制台应用程序的入口

VTK基于MFC单文档的开发

目录 项目的搭建 相关头文件的引用 添加成员变量vtkRenderer, vtkMFCWindow CXxxView()中实例化变量vtkRenderer CXxxView::OnInitialUpdate()中初始化变量vtkMFCWindow CXxxView::OnDraw(), 实现vtkMFCWindow的绘制 CXxxView::OnSize(), 窗口大小重绘 CXxxView::OnDestroy()中释放变量vtkRenderer CXxxView::~CXxxView()中释

ITK 读取Dicom序列 +VTK重建 +VTK显示

https://blog.csdn.net/qq_35007834/article/details/88569821 using ReaderType = itk::ImageSeriesReader< ImageType >; using ImageIOType = itk::GDCMImageIO; ReaderType::Pointer reader = ReaderType::New(); ImageIOType::Pointer dicomIO = ImageIOType::New(

VTK面绘制(SR)与体绘制(VR)

面绘制 (Surface Rendering) VTK中基于面绘制实现三维重建,使用的是经典的Marching Cubes(移动立方体法)算法. 面绘制是采用分割技术对一系列的二维图像进行轮廓识别.提取等操作,最终还原出被检测物体的三维模型,并以表面的方式显示出来. 面绘制的数据流管道pipeline结构为: 读取器->提取等值面->数据处理->映射器->实例化角色->绘制器->绘制窗口->交互器->交换方式.Marching Cubes算法简介: 首先,假

第02章-VTK安装(2)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] 2.3Windows XP, Vista及以上版本平台下安装VTK Windows平台下有两种安

Windows下编译和配置Vtk Web Demo

Paraview作为Ktware的产品提供了一个完整的Web客户端的后端渲染框架.具体文档和资料参考. http://www.paraview.org/ParaView/Doc/Nightly/www/js-doc/index.html 经过调研发现其实Vtk 7.0里面包含了完整相关架构和代码以及示例.只是没有提供任何文档,在发布版本里面也没有任何编译结果和文档. 参考Paraview 5.0的资料对于vtk 7进行编译和测试,发现确实保留了完整的架构. 下面是编译和配置的简单记录,假定本文的

第03章-VTK系统概述(3)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本节对应原书中的第29页至第39页] 3.2创建VTK应用程序 本章内容包括利用Tcl,C++

VTK使用矢量数据弯曲几何体

vtkWarpVector is a filter that modifies point coordinates by moving points along vector times the scale factor. Useful for showing flow profiles or mechanical deformation. The filter passes both its point data and cell data to its output. 沿法向膨胀 #!/us

Python vtk学习(1)

Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk.以下介绍VTK对于STL图像的基本操作 STL图像加载.缩放.旋转 import os import vtk base_file = "E:\\study\\c