VTK面绘制

    技术2022-05-19  20

    VTK面绘制

    #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkDICOMImageReader.h" #include "vtkPolyDataMapper.h" #include "vtkActor.h" #include "vtkOutlineFilter.h" #include "vtkCamera.h" #include "vtkProperty.h" #include "vtkPolyDataNormals.h" #include "vtkContourFilter.h" #include "vtkVolume16Reader.h"#include "vtkImageCast.h"#include "vtkImageReader.h"#include "vtkBMPReader.h"

    #include "vtkMarchingCubes.h"#include "vtkStripper.h"

    void main () //面绘{

    // Create the renderer, the render window, and the interactor. The renderer

    vtkRenderer *aRenderer = vtkRenderer::New();//建立绘制者 vtkRenderWindow *renWin = vtkRenderWindow::New(); //建立绘制窗口  renWin->AddRenderer(aRenderer); //将绘制者加入绘制窗口vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();   iren->SetRenderWindow(renWin);

      vtkDICOMImageReader *v16 = vtkDICOMImageReader::New();   v16->SetDataByteOrderToLittleEndian();   v16->SetDirectoryName("d://ct//dcm");   v16->SetDataSpacing (3.2, 3.2, 1.5);   v16->Update();

    /*      vtkVolume16Reader *v16=vtkVolume16Reader ::New();//创建一个新的读取实例      v16->SetDataDimensions(64,64);设置数据的像素      v16->SetDataByteOrderToLittleEndian();//指明写入字节顺序      v16->SetFilePrefix("C://Program Files//VTK 5.4//vtkdata//Data//headsq//quarter");//设置所读取切片数据文件的路径(E//CT/headbmpskin是路径CThead是文件名的头序列图像的名字依次为 CThead.1.bmp, CThead.2.bmp, CThead.3.bmp ……CThead.n.bmp)      v16->SetImageRange(1,93);//设置读取切片的起始段(多少张)      v16->SetDataSpacing(3.2,3.2,1.5);//设置切片之间的间距和像素之间的间距*/ /* vtkImageReader *v16 = vtkImageReader::New(); v16->SetFileName("D://skull//engine.raw"); v16->SetFileDimensionality(3);//维数 v16->SetDataScalarType(VTK_UNSIGNED_CHAR) ;//输入数据像素类型 v16->SetDataExtent(0,255,0,255,0,127);//整体输出图像范围

    */

    /*     vtkBMPReader *v16 = vtkBMPReader::New();   v16->SetDataExtent(0,175,0,135,1,3);//其中最后一个参数20 就表示我的图像序列有20张图像  v16->SetFilePrefix("D://ll//A0");  v16->SetDataSpacing (1, 1, 2);//像素间的间隔  v16->SetAllow8BitBMP (16) ;//很重要      //reader->Allow8BitBMPOff();//标志*/  //对读取数据类型匹配 vtkImageCast *readerImageCast = vtkImageCast::New();    readerImageCast->SetInput((vtkDataObject *)v16->GetOutput()); readerImageCast->SetOutputScalarTypeToUnsignedShort();

      vtkMarchingCubes *skinExtractor=vtkMarchingCubes::New();//建立一个Marching Cubes 算法的对象取出等值面的三角面片      skinExtractor->SetInput((vtkDataObject *)readerImageCast->GetOutput());//获得所读取的CT 数据      skinExtractor->SetValue(0,500);//提取出等值线值为500 的皮肤

          vtkStripper *skinNormals=vtkStripper::New();//建立三角带对象      skinNormals->SetInput(skinExtractor->GetOutput());//将生成的三角片连接成三角带        vtkPolyDataMapper *skinMapper=vtkPolyDataMapper::New();//建立一个数据映射对象       skinMapper->SetInput(skinNormals->GetOutput());//将三角带映射为几何数据/*

    //vtkMarchingContourFilter//SetValueGenerateValues均为设置等值线值的函数首先调用GenerateValues(3, 100, 300)产生3条等值线,分别为100200300;然后调用SetValue(0, 125),则最终效果为共有3条等值线,分别为125200300;如果改为调用SetValue(3, 400),则最终效果为共有4条等值线,分别为100200300400.SetValue一般用于覆盖某一条已经存在的等值线,或者增加一条等值线;GenerateValues一般重新设置等值线的条数。vtkContourFilter *skinExtractor = vtkContourFilter::New(); //建立一个Contour Filter算法的对象提取多个等值面  skinExtractor->SetInputConnection(readerImageCast->GetOutputPort()); //获得所读取的CT 数据  skinExtractor->GenerateValues(3, 100, 300);//GenerateValues对应n条等值线的值  skinExtractor->SetValue(3, 500); //SetValue设置一条等值线值 

    vtkPolyDataNormals *skinNormals = vtkPolyDataNormals::New(); //曲面法向量  skinNormals->SetInputConnection(skinExtractor->GetOutputPort());   skinNormals->SetFeatureAngle(80.0); //);//设定一个阈值 确定的边缘

    vtkPolyDataMapper *skinMapper = vtkPolyDataMapper::New(); //建立一个数据映射对象  skinMapper->SetInputConnection(skinNormals->GetOutputPort());   skinMapper->ScalarVisibilityOff(); //断开标志(是否上色)*/

    vtkActor *skin = vtkActor::New(); //建立一个代表皮肤的演员  skin->SetMapper(skinMapper); //获得皮肤几何数据的属性  skin->GetProperty()->SetDiffuseColor(1, .19, .15); //设置皮肤颜色的属性  skin->GetProperty()->SetSpecular(.3); //设置反射率  skin->GetProperty()->SetSpecularPower(20); //设置反射光强度

    // An outline provides context around the data.    vtkOutlineFilter *outlineData = vtkOutlineFilter::New(); //轮廓线设置  outlineData->SetInputConnection(v16->GetOutputPort());

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

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

    vtkCamera *aCamera = vtkCamera::New(); //定义摄像机  aCamera->SetViewUp (0, 0, -1); //取得摄像机方向  aCamera->SetPosition (0, 1, 0); //光源位置  aCamera->SetFocalPoint (0, 0, 0); //取焦点坐标  aCamera->ComputeViewPlaneNormal();  aRenderer->AddActor(outline); //添加角色aRenderer->AddActor(skin); aRenderer->SetActiveCamera(aCamera); aRenderer->ResetCamera (); aCamera->Dolly(1.5); //大于1向摄像机焦点移动 小于1则向远离焦点的方向移动

     aRenderer->SetBackground(1,1,1); 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();

    // It is important to delete all objects created previously to prevent

    v16->Delete(); skinExtractor->Delete(); skinNormals->Delete(); skinMapper->Delete(); skin->Delete(); outlineData->Delete(); mapOutline->Delete(); outline->Delete(); aCamera->Delete(); iren->Delete(); renWin->Delete(); aRenderer->Delete();

    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    #include "vtkRenderer.h"#include "vtkRenderWindow.h"#include "vtkRenderWindowInteractor.h"#include "vtkSphereSource.h"#include "vtkShrinkFilter.h"#include "vtkElevationFilter.h"#include "vtkDataSetMapper.h"#include "vtkActor.h"#include "vtkCullerCollection.h"

     

    void main( int argc, char *argv[] ){    vtkRenderer *renderer = vtkRenderer::New();    renderer->GetCullers()->RemoveAllItems();    vtkRenderWindow *renWin = vtkRenderWindow::New();    renWin->AddRenderer(renderer);    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();    iren->SetRenderWindow(renWin);    vtkSphereSource *sphere = vtkSphereSource::New();    sphere->SetThetaResolution(12); sphere->SetPhiResolution(12);    vtkShrinkFilter *shrink = vtkShrinkFilter::New();    shrink->SetInput((vtkDataSet *)sphere->GetOutput());    shrink->SetShrinkFactor(0.9);

        vtkElevationFilter *colorIt = vtkElevationFilter::New();    colorIt->SetInput((vtkDataSet *)shrink->GetOutput());    colorIt->SetLowPoint(0,0,-0.5);    colorIt->SetHighPoint(0,0,0.5);

        vtkDataSetMapper *mapper = vtkDataSetMapper::New();    mapper->SetInput(colorIt->GetOutput());

        vtkActor *actor = vtkActor::New();    actor->SetMapper(mapper);    renderer->AddActor(actor);    renderer->SetBackground(1,1,1);    renWin->SetSize(400,400);

        renWin->Render(); // execute first time

     

        // interact with data    iren->Start();

        // Clean up    renderer->Delete();    renWin->Delete();    iren->Delete();    sphere->Delete();    shrink->Delete();    colorIt->Delete();    mapper->Delete();    actor->Delete();}

     我想读BMP文件,但是程序运行后只有一个立方体出现,没有我包含的图片信息。

    想问一下大家怎么会这样

    是参数设置问题还是?


    最新回复(0)