首页 > 其他分享 >vtk中截取图像显示

vtk中截取图像显示

时间:2023-07-20 17:25:14浏览次数:34  
标签:1.0 pColorTable vtk windowToImageFilter 图像 New include 截取 Delete

目录
部分项目中需要截取vtk图像进行显示

1.CmakeLists

#1.设置cmake的最小版本
cmake_minimum_required(VERSION 3.3...3.12 FATAL_ERROR)

#2.设置项目名称
project (Step2)
#3.查找vtk
find_package(VTK REQUIRED)
#4.vtk模块的设置
vtk_module_config(VTK
  vtkCommonCore
  vtkFiltersSources
  vtkFiltersSources
  vtkInteractionStyle
  vtkRenderingOpenGL2
  vtkIOImage
)

#5.包含头文件
include(${VTK_USE_FILE})
#6.添加可执行文件
add_executable(CubeAxesActor MACOSX_BUNDLE CubeAxesActor.cxx)
#7.为可执行文件链接库
target_link_libraries(CubeAxesActor ${VTK_LIBRARIES})

2.C++实现部分

#include "vtkActor.h"
#include "vtkCamera.h"
#include "vtkConeSource.h"
#include "vtkCellArray.h"
#include "vtkFloatArray.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include <vtkLookupTable.h>
#include <vtkWindowToImageFilter.h>
#include <vtkPNGWriter.h>
int main()
{
	int i;
	// 梯形的顶点坐标
	static float x[8][3] = {{0, 0, 0}, {4, 0, 0}, {4, 4, 0}, {0, 4, 0}, {1, 1, 1}, {3, 1, 1}, {3, 3, 1}, {1, 3, 1}};
	// 4个顶点构成一个单元,一共6个单元
	static vtkIdType y[6][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {0, 1, 5, 4}, {1, 2, 6, 5}, {2, 3, 7, 6}, {3, 0, 4, 7}};

	vtkPoints *points = vtkPoints::New();
	for (i = 0; i < 8; i++)
		points->InsertPoint(i, x[i]);

	vtkCellArray *polys = vtkCellArray::New();
	for (i = 0; i < 6; i++)
		polys->InsertNextCell(4, y[i]);
	// 存储标量值
	vtkFloatArray *scalars = vtkFloatArray::New();
	for (i = 0; i < 8; i++)
		scalars->InsertTuple1(i, i);
	// 构建多边形数据
	vtkPolyData *cube = vtkPolyData::New();
	cube->SetPoints(points);
	// 设定单元的组成方式
	cube->SetPolys(polys);
	cube->GetPointData()->SetScalars(scalars);

	// 定义颜色映射表
	vtkLookupTable *pColorTable = vtkLookupTable::New();
	pColorTable->SetNumberOfColors(6);
	pColorTable->SetTableValue(0, 1.0, 0.0, 1.0, 1.0);
	pColorTable->SetTableValue(1, 0.0, 1.0, 1.0, 1.0);
	pColorTable->SetTableValue(2, 1.0, 1.0, 1.0, 1.0);
	pColorTable->SetTableValue(3, 1.0, 0.0, 1.0, 1.0);
	pColorTable->SetTableValue(4, 0.0, 0.0, 1.0, 1.0);
	pColorTable->SetTableValue(5, 1.0, 1.0, 0.0, 1.0);
	pColorTable->Build();

	/*数据映射*/
	vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
	cubeMapper->SetInputData(cube);
	cubeMapper->SetScalarRange(0, 7);
	cubeMapper->SetLookupTable(pColorTable);

	vtkActor *cubeActor = vtkActor::New();//创建actor对象
	cubeActor->SetMapper(cubeMapper);
	
	vtkCamera *camera = vtkCamera::New();//vktcamera设置
	camera->SetPosition(1, 1, 1); //相机位置设置
	camera->SetFocalPoint(0, 0, 0);//相机焦点设置

	vtkRenderer *renderer = vtkRenderer::New();//创建vtkRenderer对象
	vtkRenderWindow *renWin = vtkRenderWindow::New();//创建vtkRenderer窗口对象
	renWin->AddRenderer(renderer);//将vtkRenderer与vtkRenderer窗口关联

	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();//创建interactor对象
	iren->SetRenderWindow(renWin);//设置interactor的的renderwindow
	renderer->AddActor(cubeActor);//将actor加入到render中

	renderer->SetActiveCamera(camera);//renderer设置的的选择camera
	renderer->ResetCamera();//renderer相机重置
	renderer->SetBackground(1, 1, 1);//设置渲染的背景颜色

	renWin->SetSize(800, 800);//设置渲染窗口大小
	renWin->Render();


	/* vtkWindowToImageFilter屏幕截图*/
	vtkNew<vtkWindowToImageFilter> windowToImageFilter;//vtkWindowToImageFilter获取vtk窗体的图像
	windowToImageFilter->SetInput(renWin); // 设定输入窗口
	windowToImageFilter->SetInputBufferTypeToRGBA(); // 设置格式类型
#if VTK_MAJOR_VERSION >= 8 || VTK_MAJOR_VERSION == 8 && VTK_MINOR_VERSION >= 90
	windowToImageFilter->SetScale(1); 
#else
	windowToImageFilter->SetMagnification(2); 
#endif
	windowToImageFilter->SetInputBufferTypeToRGB(); // 设置图像存储图像格式
	windowToImageFilter->ReadFrontBufferOff();		
	windowToImageFilter->Update();


	/* vtkPNGWriter保存屏幕截取图像*/
	vtkNew<vtkPNGWriter> writer;
	writer->SetFileName("screenshot2.png");
	writer->SetInputConnection(windowToImageFilter->GetOutputPort());
	writer->Write();

	iren->Start();  //interactor如果开启无法截图

	// 删除
	points->Delete();
	polys->Delete();
	scalars->Delete();
	cube->Delete();
	cubeMapper->Delete();
	cubeActor->Delete();
	camera->Delete();
	renderer->Delete();
	renWin->Delete();
	iren->Delete();
	pColorTable->Delete();
	return 0;
}

标签:1.0,pColorTable,vtk,windowToImageFilter,图像,New,include,截取,Delete
From: https://www.cnblogs.com/codeAndlearn/p/17568844.html

相关文章

  • java字符串截取第一位
    Java字符串截取第一位在Java中,字符串是一个非常重要的数据类型。我们经常需要对字符串进行各种操作,比如截取字符串的某个部分。本文将介绍如何使用Java代码来截取字符串的第一位。字符串的基本概念在Java中,字符串是一个由字符组成的序列。每个字符都有一个对应的索引,从0开始计数......
  • java正则表达式截取json
    Java正则表达式截取JSON介绍JSON(JavaScriptObjectNotation)是一种常用的数据格式,用于在不同的编程语言之间传递和存储数据。在Java中,我们经常需要从JSON数据中提取特定的信息,这时候正则表达式就可以派上用场。正则表达式是一种强大的文本匹配工具,可以让我们通过模式匹配来提取需......
  • jquery截取字符串最前面
    使用jQuery截取字符串最前面的方法介绍在开发过程中,我们经常需要对字符串进行一些操作,其中一项常见的操作就是截取字符串。本文旨在教会刚入行的开发者如何使用jQuery来截取字符串最前面的部分。准备工作在开始之前,确保你已经引入了jQuery库。如果没有引入,可以在HTML文件中添加......
  • jquery根据符号截取字符串
    jQuery根据符号截取字符串引言在前端开发中,经常会遇到需要截取字符串的需求。而使用jQuery库可以方便地处理字符串截取操作。本文将介绍如何使用jQuery根据符号截取字符串,并提供相应的代码示例。了解jQueryjQuery是一个快速、简洁的JavaScript库,它主要用于处理HTML文档的遍历、......
  • mysql 截取逗号第二个位置
    MySQL截取逗号第二个位置在MySQL中,截取字符串中某个位置的值是一种常见的操作。本文将介绍如何使用MySQL截取字符串中逗号的第二个位置的值,并提供相应的代码示例。什么是MySQL截取字符串?MySQL截取字符串是指从一个字符串中提取出所需的部分。这在处理包含多个数据的字段时非常有......
  • mysql 截取
    MySQL截取在MySQL中,截取(Substring)是指从一个字符串中取出部分内容的操作。截取操作在数据处理和字符串处理中非常常见,MySQL提供了多种截取字符串的函数,可以根据需求选择合适的函数来实现截取操作。SUBSTRING函数MySQL中的SUBSTRING函数用于截取一个字符串的子串。它的语法如下:S......
  • VTK mouse event -- 捕捉鼠标动作并发送信号:vtkCommand
    头文件申明:#pragmaonce#include<QObject>#include<vtkCallbackCommand.h>#include<vtkRenderWindow.h>#include<vtkRenderWindowInteractor.h>#include<vtkRenderer.h>#include<vtkSmartPointer.h>classMyMouseCallback:......
  • ISP之红外图像增强处理算法
    1、红外图像1.1红外图像特点红外图像一般具有以下特点(一般中长波特点更明显):1)红外图像表征景物的温度分布,反映目标及背景向外辐射能量的差异,是灰度图像,像素分辨率低;2)红外探测气球收到加工工艺影响,靶面分辨率较低,1280x1024分辨率属于高分辨率,640x512的规格较多;3)红外波段会受到......
  • sam代码解读之将mask画在图像上
    先看看代码defshow_anns(anns):iflen(anns)==0:#anns是个mask列表,里面包含很多mask,每个mask又是一个dict,里面有segmentation,area等returnsorted_anns=sorted(anns,key=(lambdax:x['area']),reverse=True)#根据area排序ax=plt.gca()#此......
  • coc仓库--从内存中读取图像
    从内存中读取图像1.源码voidcreateMatFromMem(FILE*file,cv::Mat*mat){uchar*mem_pic=newuchar[6268932/sizeof(uchar)];longsize=0;fread(mem_pic,sizeof(uchar),6268932/sizeof(uchar),file);pclose(file);cv::_InputArraypic_a......