【vtkWidgetRepresentation】第九期 vtkAffineRepresentation2D仿射变换

本文主要是介绍【vtkWidgetRepresentation】第九期 vtkAffineRepresentation2D仿射变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

很高兴在雪易的CSDN遇见你

【vtkWidgetRepresentation】第九期 vtk中的仿射变换


前言

本文分享VTK中的仿射变换,实际结果如下图所示,希望对各位小伙伴有所帮助!

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO

vtkAffineWidget


1. vtkAffineRepresentation

        主要定义了仿射变换的几何表示。关键参数有:

1.1 GetTransform获取定义的线性变换矩阵。

1.2 SetTolerance,设置激活Handle的容差。

1.3 交互状态,包括:

Outside外部
Rotate旋转
Translate移动
TranslateX沿X轴移动
TranslateY沿Y轴移动
ScaleWEdge沿W边界缩放
ScaleEEdge沿E边界缩放
ScaleNEdge沿N边界缩放
ScaleSEdge沿S边界缩放
ShearWEdge沿W边界剪切
ShearEEdge沿E边界剪切
ShearNEdge沿N边界剪切
ShearSEdge沿S边界剪切
MoveOriginX中心点沿X轴移动
MoveOriginY中心点沿Y轴移动
MoveOrigin移动中心点

2. vtkAffineRepresentation2D

        vtkAffineRepresentation2D包含三部分:一个矩形,一个圆形和一个十字;矩形用于缩放和剪切;圆形用于旋转;十字用于移动。这三部分在视平面上进行显示,并保持一个恒定的高度和宽度。其重要参数如下:

2.1 设置不同部位的宽度

        SetBoxWidth,SetCircleWidth,SetAxesWidth

2.2 设置包围盒的原点

        SetOrigin

2.3 获取选中和未选中的属性

        Set/GetProperty,Set/GetSelectedProperty, Set/GetTextProperty

2.4 获取显示的文字

        SetDisplayText/GetDisplayText

3. vtkAffineWidget及其应用

#include <vtkActor.h>
#include <vtkAffineRepresentation2D.h>
#include <vtkAffineWidget.h>
#include <vtkAppendPolyData.h>
#include <vtkCommand.h>
#include <vtkInteractorStyleSwitch.h>
#include <vtkPlaneSource.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkTransform.h>class vtkAffineCallback : public vtkCommand
{
public:static vtkAffineCallback *New(){ return new vtkAffineCallback; }virtual void Execute(vtkObject *caller, unsigned long, void*);vtkAffineCallback():Actor(0),AffineRep(0){this->Transform = vtkTransform::New();}~vtkAffineCallback(){this->Transform->Delete();}vtkActor *Actor;vtkAffineRepresentation2D *AffineRep;vtkTransform *Transform;
};void vtkAffineCallback::Execute(vtkObject*, unsigned long vtkNotUsed(event), void*)
{this->AffineRep->GetTransform(this->Transform);this->Actor->SetUserTransform(this->Transform);
}int main(int, char *[])
{// Create two spheres: a larger one and a smaller one on top of the larger one// to show a reference point while rotatingvtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->Update();vtkSmartPointer<vtkSphereSource> sphereSource2 =vtkSmartPointer<vtkSphereSource>::New();sphereSource2->SetRadius(0.075);sphereSource2->SetCenter(0,0.5,0);sphereSource2->Update();// Append the two spheres into one vtkPolyDatavtkSmartPointer<vtkAppendPolyData> append =vtkSmartPointer<vtkAppendPolyData>::New();append->AddInputConnection(sphereSource->GetOutputPort());append->AddInputConnection(sphereSource2->GetOutputPort());// Create a plane centered over the larger sphere with 4x4 sub sectionsvtkSmartPointer<vtkPlaneSource> planeSource =vtkSmartPointer<vtkPlaneSource>::New();planeSource->SetXResolution(4);planeSource->SetYResolution(4);planeSource->SetOrigin(-1,-1,0);planeSource->SetPoint1(1,-1,0);planeSource->SetPoint2(-1,1,0);// Create a mapper and actor for the plane: show it as a wireframevtkSmartPointer<vtkPolyDataMapper> planeMapper =vtkSmartPointer<vtkPolyDataMapper>::New();planeMapper->SetInputConnection(planeSource->GetOutputPort());vtkSmartPointer<vtkActor> planeActor =vtkSmartPointer<vtkActor>::New();planeActor->SetMapper(planeMapper);planeActor->GetProperty()->SetRepresentationToWireframe();planeActor->GetProperty()->SetColor(1,0,0);// Create a mapper and actor for the spheresvtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(append->GetOutputPort());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);// Create a renderer and render windowvtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);renderer->AddActor(actor);renderer->AddActor(planeActor);renderer->GradientBackgroundOn();renderer->SetBackground(1,1,1);renderer->SetBackground2(0,0,1);// Create an interactorvtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();renderWindowInteractor->SetRenderWindow(renderWindow);dynamic_cast<vtkInteractorStyleSwitch*>(renderWindowInteractor->GetInteractorStyle())->SetCurrentStyleToTrackballCamera();// Create an affine widget to manipulate the actor// the widget currently only has a 2D representation and therefore applies transforms in the X-Y plane onlyvtkSmartPointer<vtkAffineWidget> affineWidget =vtkSmartPointer<vtkAffineWidget>::New();affineWidget->SetInteractor(renderWindowInteractor);affineWidget->CreateDefaultRepresentation();dynamic_cast<vtkAffineRepresentation2D*>(affineWidget->GetRepresentation())->PlaceWidget(actor->GetBounds());vtkSmartPointer<vtkAffineCallback> affineCallback =vtkSmartPointer<vtkAffineCallback>::New();affineCallback->Actor = actor;affineCallback->AffineRep = dynamic_cast<vtkAffineRepresentation2D*>(affineWidget->GetRepresentation());affineWidget->AddObserver(vtkCommand::InteractionEvent,affineCallback);affineWidget->AddObserver(vtkCommand::EndInteractionEvent,affineCallback);renderWindow->Render();renderWindowInteractor->Initialize();renderWindow->Render();affineWidget->On();// begin mouse interactionrenderWindowInteractor->Start();return EXIT_SUCCESS;
}

结论:

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

这篇关于【vtkWidgetRepresentation】第九期 vtkAffineRepresentation2D仿射变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482931

相关文章

Halcon 几何变换之仿射变换

几何变换包括仿射变换、投影变换、图像变换以及极坐标变换。不同的资料可能会有不同的划分。它们具体的数学表达感性趣的可以自己查找。这里只描述Halcon的仿射变换运用。 Halcon中的放射变换常用的两种方式:旋转以及缩放(当然平移也常用,但是不属于仿射变换)。变换涉及到三个量,一个是待变换的图像或者说矩阵,一个变换矩阵,以及变换后的图像或者矩阵。所以在Halcon中会有两种运用方式。第一种:已知待

halcon 仿射变换功能函数,

1.仿射变换有:平移、旋转、缩放、斜切。 2.要进行仿射变换,必须先获取变换矩阵。要获取变换矩阵,必须先获取特征点坐标、角度等信息,几何匹配和bolb是获取特征点的高效方法,除此之外还有其它方法,只要能稳定的求出特征点即可。 3.仿射变换流程    (1.)获取特征点坐标、角度    (2.)计算仿射变换矩阵    (3.)对图像、区域、轮廓进行仿射变换 4.根据特征点、角度计算仿射变

图像处理之仿射变换

仿射变换 什么是仿射变换仿射变换有什么用 什么是仿射变换 仿射变换(原图和一个矩阵进行运算)是指在几何中,图像从一个向量空间经过一次线性变换和一次平移,映射到另一个向量空间的过程。 这种变换可以保持图像的“平直性”和“平行性”,即直线经过仿射变换后仍然是直线,平行线经过变换后仍然保持平行。 仿射变换有什么用 图像校正: 当图像由于相机角度、镜头畸变或其他因素产生透视变形时,

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(仿射变换)

本系列学习笔记参考自OpenCV2.4.10之opencv\sources\samples\cpp\tutorial_code和http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html 本博文将继续学习opencv-tutorial-code中的ImgTrans,这里讲主要介绍仿射变换。仿射变换是直角坐标系的一种,描述的是一

OpenCV几何图像变换(9)仿射变换函数warpAffine()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 函数是应用一个仿射变换到图像上。 warpAffine 函数使用指定的矩阵对源图像进行仿射变换: dst ( x , y ) = src ( M 11 x + M 12 y + M 13 , M 21 x + M 22 y + M 23 )

EmguCV学习笔记 C# 5.2 仿射变换

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客 笔者的

OpenCV几何图像变换(2)计算仿射变换矩阵的函数getAffineTransform()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 计算三对对应点之间的仿射变换。 该函数计算 2×3 的仿射变换矩阵,使得: [ x i ′ y i ′ ] = map_matrix ⋅ [ x i y i 1 ] \begin{bmatrix} x'_i \\ y'_i \end{bmat

opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移

常常需要对图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标。 仿射变换在:http://blog.csdn.net/xiaowei_cqu/article/details/7616044 这位大牛的博客中已经介绍的非常清楚。 关于仿射变换的详细介绍,请见上面链接的博客。

opencv 仿射变换实例

opencv 仿射变换实例 1.在一张空白图上创建四个随机点2.直接使用opencv自带的warpAffine3.显示原图所有像素的warpAffine之14.显示原图所有像素的warpAffine之2参考文献 通过实例展示opencv的仿射变换及其应用。 这里需要注意的是哪个维度是x,哪个维度是y。 ..........x...y 这个定义与矩阵的x,y维度不一致

第九期济南科创生态大会即将盛大开启,为中小企业注入新动能

【头部财经】近日,备受瞩目的第九期济南科创生态大会即将拉开帷幕。本次大会将聚焦科技创新领域,为参会者提供一个交流合作、资源对接的优质平台。 作为一个专为中小企业打造的科技创新交流平台,济南科创生态大会一直致力于促进中小企业的发展和创新。每期大会都吸引了众多企业参与,成为了科创企业之间、科创企业与服务机构、科创企业与相关平台交流与互通的重要平台。 据悉,本次大会将围绕“知识更新、链接资源、获取商