参考博客:VTK修炼之道16:图像处理_窗口分割和图像融合(Viewport&vtkImageBlend)_vtkviewport_沈子恒的博客-CSDN博客主要找一张.jpg的图片,然后路径如果找不到的话,就用绝对路径。这个功能就是实现多张图片融合的效果,下面看下代码:
int main()
{
vtkSmartPointer<vtkJPEGReader> jpgReader = vtkSmartPointer<vtkJPEGReader>::New();
jpgReader->SetFileName("234.jpg");
jpgReader->Update();
vtkSmartPointer<vtkImageCanvasSource2D> source2D = vtkSmartPointer<vtkImageCanvasSource2D>::New();
source2D->SetNumberOfScalarComponents(1);
source2D->SetScalarTypeToUnsignedChar();
source2D->SetExtent(0, 512, 0, 512, 0, 0);
source2D->SetDrawColor(0, 0, 0);
source2D->FillBox(0, 512, 0, 512);
source2D->SetDrawColor(255, 255, 255);
source2D->FillBox(100, 400, 100, 400);
source2D->Update();
//融合
vtkSmartPointer<vtkImageBlend> blendImage = vtkSmartPointer<vtkImageBlend>::New();
blendImage->AddInputData(jpgReader->GetOutput());
blendImage->AddInputData(source2D->GetOutput());
blendImage->SetOpacity(0, 0.5);
blendImage->SetOpacity(1, 0.7);
blendImage->Update();
//渲染引擎
vtkSmartPointer<vtkImageActor> actorImage1 = vtkSmartPointer<vtkImageActor>::New();
actorImage1->SetInputData(jpgReader->GetOutput());
vtkSmartPointer<vtkImageActor> actorImage2 = vtkSmartPointer<vtkImageActor>::New();
actorImage2->SetInputData(source2D->GetOutput());
vtkSmartPointer<vtkImageActor> blend_Actor =vtkSmartPointer<vtkImageActor>::New();
blend_Actor->SetInputData(blendImage->GetOutput());
//定义视窗大小(xmin.ymin,xmax,ymax)
//按window的尺寸进行比例分割
double leftView[4] = { 0,0,0.33,1 };
double midView[4] = { 0.33,0,0.66,1 };
double rightView[4] = { 0.66,0,1,1 };
//render
vtkSmartPointer<vtkRenderer> render1 = vtkSmartPointer<vtkRenderer>::New();
render1->SetViewport(leftView);
render1->AddActor(actorImage1);
render1->ResetCamera();
render1->SetBackground(0, 0, 0);
vtkSmartPointer<vtkRenderer> render2 = vtkSmartPointer<vtkRenderer>::New();
render2->SetViewport(midView);
render2->AddActor(actorImage2);
render2->ResetCamera();
render2->SetBackground(0, 0, 0);
vtkSmartPointer<vtkRenderer> render3 = vtkSmartPointer<vtkRenderer>::New();
render3->SetViewport(rightView);
render3->AddActor(blend_Actor);
render3->ResetCamera();
render3->SetBackground(0, 0, 0);
//window
vtkSmartPointer<vtkRenderWindow> renderwindow = vtkSmartPointer<vtkRenderWindow>::New();
renderwindow->AddRenderer(render1);
renderwindow->AddRenderer(render2);
renderwindow->AddRenderer(render3);
renderwindow->SetSize(640, 320);
renderwindow->SetWindowName("Image-Blend");
renderwindow->Render();
//interactor
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
interactor->SetInteractorStyle(style);
interactor->SetRenderWindow(renderwindow);
interactor->Initialize();
interactor->Start();
return 0;
}
最后看下融合的效果: