图像数据实例:
图像实例 1(绘制图像):
#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
#include <vtkTransform.h>
#include <vtkProperty.h>
#include <vtkImageCanvasSource2D.h>
int main(int argc, char* argv[])
{
vtkSmartPointer<vtkRenderWindow> m_pRenderWin = vtkRenderWindow::New();
vtkSmartPointer<vtkRenderWindowInteractor> m_pInteractor = vtkRenderWindowInteractor::New();
vtkSmartPointer<vtkInteractorStyleTrackballCamera> m_pInteractorStyle = vtkInteractorStyleTrackballCamera::New();
vtkSmartPointer<vtkImageActor> m_actor = vtkImageActor::New();
vtkSmartPointer<vtkRenderer> m_render = vtkRenderer::New();
vtkSmartPointer<vtkImageCanvasSource2D> m_Image = vtkImageCanvasSource2D::New();
vtkSmartPointer<vtkTransform> m_trans = vtkTransform::New();
vtkSmartPointer<vtkCamera> m_pCamera = vtkCamera::New();
m_Image->SetScalarTypeToUnsignedChar(); // 数据类型
m_Image->SetNumberOfScalarComponents(1); // 设置数量
m_Image->SetExtent(0, 100, 0, 100, 0, 0); // 设置画布大小,xyz范围
m_Image->SetDrawColor(0, 0, 0, 0); // 黑色
m_Image->FillBox(0, 100, 0, 100); // 画满整个画布
m_Image->SetDrawColor(180, 0, 0, 0); // 第一个参数决定颜色,只能是0~255的黑白渐变色
m_Image->FillBox(40, 60, 20, 40); // 画的范围,填充Box
m_Image->Update();
m_actor->SetInputData(m_Image->GetOutput()); // vtkImageData类型
m_trans->Translate(0, 0, 0);
m_trans->RotateX(0); // 沿x轴正方向顺时针旋转
m_actor->SetUserTransform(m_trans);
m_render->AddActor(m_actor);
//-------------------------------------------------------------------------
// 相机设置
m_pCamera->SetPosition(0, 0, 50);
m_pCamera->SetFocalPoint(0, 0, 0);
//-------------------------------------------------------------------------
m_render->SetActiveCamera(m_pCamera);
m_render->ResetCamera();
m_render->SetViewport(0.0, 0.0, 1.0, 1.0);
m_render->SetBackground(0.5, 0.3, 0.2);
m_render->SetGradientBackground(true); // 背景色渐变
m_pRenderWin->AddRenderer(m_render);
m_pRenderWin->SetSize(800, 600);
m_pRenderWin->Render();
m_pInteractor->SetInteractorStyle(m_pInteractorStyle);
m_pInteractor->SetRenderWindow(m_pRenderWin);
m_pRenderWin->Render();
m_pInteractor->Start();
return 0;
}
上面,绘制了一副2d图像,即黑色背景下绘制了一块白色的块,如图:
此外,还有很多可以生成2D图像的类,例如:
(1)、vtkImageEllipsoidSource:生成椭圆图像的类。
(2)、vtkImageGirdSource:生成网格图像的类
(3)、vtkImageNoiseSource:生成随机图像的类(噪声图像)。
(4)、vtkImageSinusoidSource:生成正弦函数图像。
(5)、vtkImageGaussianSource:生成符合高斯分布的图像。
图像数据:生成的图像,其类型全是vtkImageData类型,此外,图像不限于2D图像,实际上,之前例程中,读取的DICOM文件生成的图像是组成了一个空间的,这样,可以选择其中某个位置的图像显示,可以理解为:三维空间XYZ三个方向都层叠着很多层图像。实际可能并非如此。
生成图像:实际上,要得到vtkImageData,还可以直接申请一个vtkImageData来进行更改,并不是一定要从文件读取图片,或者创建自己的图像。
图像实例 2(打开图片):
int main(int argc, char*argv[])
{
vtkSmartPointer<vtkPNGReader> pngReader = vtkSmartPointer<vtkPNGReader>::New();
pngReader->SetFileName("ironMan.png");
pngReader->Update();
vtkSmartPointer<vtkSphereSource> ball = vtkSmartPointer<vtkSphereSource>::New();
ball->SetCenter(0.0, 0.0, 0.0);
ball->SetRadius(20.0);
ball->SetPhiResolution(10);
ball->SetThetaResolution(20);
ball->Update();
// vtkSmartPointer<vtkPolyDataMapper> pngMap = vtkSmartPointer<vtkPolyDataMapper>::New();
// pngMap->SetInputConnection(pngReader->GetOutputPort());
// vtkSmartPointer<vtkActor> pngActor = vtkSmartPointer<vtkActor>::New();
// pngActor->SetMapper(pngMap);
vtkSmartPointer<vtkImageActor> pngAct = vtkSmartPointer<vtkImageActor>::New();
pngAct->SetInputData(pngReader->GetOutput());
pngAct->GetProperty()->SetBackingColor(0.8, 0.6, 0.4); // 无效
vtkSmartPointer<vtkPolyDataMapper> ballMap = vtkSmartPointer<vtkPolyDataMapper>::New();
ballMap->SetInputConnection(ball->GetOutputPort());
vtkSmartPointer<vtkActor> ballActor = vtkSmartPointer<vtkActor>::New();
ballActor->SetMapper(ballMap);
vtkSmartPointer<vtkRenderer> pngRenderer = vtkSmartPointer<vtkRenderer>::New();
// pngRenderer->AddActor(pngActor); // 无效的
pngRenderer->AddActor(pngAct);
pngRenderer->AddActor(ballActor);
pngRenderer->SetViewport(0, 0, 1.0, 1.0); // 设置显示范围
vtkSmartPointer<vtkRenderWindow> pngWnd = vtkSmartPointer<vtkRenderWindow>::New();
pngWnd->AddRenderer(pngRenderer);
pngWnd->SetSize(800, 600);
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetRenderWindow(pngWnd);
iren->SetInteractorStyle(style);
pngWnd->Render();
iren->Initialize();
iren->Start();
}
上面代码显示了一个 球体和一张图片,球体在原点(0,0,0)。图像如下:
同样,vtk还提供了其他图像格式的读取器,使用他们的Writer类,可以写入图片,可以将png图像读取后,保存为jpg格式等,可以实现图像格式的转换。
来源:CSDN
作者:蒲公英24
链接:https://blog.csdn.net/qq_31622605/article/details/81208328