几何变换

二维平面中基本的几何变换 例如,我要对由A(1,2)、B(2,2)、C(2,1)、D(1,1)四个点构成的一个正方形,相对于(1,1)这个点,在x轴方向缩为原来的0.5倍。则要先移动ABCD四个顶点,移动后各顶点的坐标为A(0,1)、B(1,1)、C(1,0)、D(0,0)。此时再进行缩放,缩放后四个顶点的坐标分别为A(0,1)、B(0.5,1)、C(0.5,0)、D(0,0)。如果想相对于平面上任意一点(x,y)的缩放,需要把要缩放的点都减去(x,y),然后再进行缩放,缩放后,各点再加上(x,y)。都为1时,对象大小不变。 阅读详情

几何变换详解
在三维图形学中,几何变换大致分为三种,平移变换(Translation),缩放变换(Scaling),旋转变换(Rotation)。以下讨论皆针对DirectX,所以使用左手坐标系。

平移变换

将三维空间中的一个点[x, y, z, 1]移动到另外一个点[x’, y’, z’, 1],三个坐标轴的移动分量分别为dx=Tx, dy=Ty, dz=Tz, 即

x’ = x + Tx

y’ = y + Ty

z’ = z + Tz

平移变换的矩阵如下。
在这里插入图片描述

缩放变换

将模型放大或者缩小,本质也是对模型上每个顶点进行放大和缩小(顶点坐标值变大或变小),假设变换前的点是[x, y, z, 1],变换后的点是[x’, y’, z’, 1],那么

x’ = x * Sx

y’ = y * Sy

z’ = z * Sz

缩放变换的矩阵如下。
在这里插入图片描述

旋转变换

这是三种变换中最复杂的变换,这里只讨论最简单的情况,绕坐标轴旋转,关于绕任意轴旋转,在后续的随笔中介绍。

绕X轴旋转
在这里插入图片描述

绕X轴旋转时,顶点的x坐标不发生变化,y坐标和z坐标绕X轴旋转θ度,旋转的正方向为顺时针方向(沿着旋转轴负方向向原点看)。[x, y, z, 1]表示变换前的点,[x’, y’, z’, 1]表示变换后的点。变换矩阵如下。关于旋转的正方向,OpenGL与多数图形学书籍规定旋转正方向为逆时针方向(沿着坐标轴负方向向原点看),比如Computer Graphics C Version,p409。
在这里插入图片描述

绕Y轴旋转

在这里插入图片描述
绕Y轴旋转时,顶点的y坐标不发生变化,x坐标和z坐标绕Y轴旋转θ度。[x, y, z, 1]表示变换前的点,[x’, y’, z’, 1]表示变换后的点。变换矩阵如下。
在这里插入图片描述

绕Z轴旋转

在这里插入图片描述
绕Z轴旋转时,顶点的z坐标不发生变化,x坐标和y坐标绕Z轴旋转θ度。[x, y, z, 1]表示变换前的点,[x’, y’, z’, 1]表示变换后的点。变换矩阵如下。
在这里插入图片描述

绕坐标轴旋转的矩阵推导
上面三个旋转矩阵是如何得来的呢?我们推导一下,首先看一下二维的情况,再扩展到三维即可。实际上上面三种绕坐标轴旋转的情况属于特殊的二维旋转,比如绕Z轴旋转,相当于在与XOY平面上绕原点做二维旋转。

假设点P(x, y)是平面直角坐标系内一点,其到原点的距离为r,其与X轴的夹角为A,现将点P绕原点旋转θ度,得到点P’(x’, y’),P’与X轴的夹角为B,则A = B - θ。(注意,在二维坐标中,逆时针旋转时角度为正,顺时针旋转时角度为负,下图中由P旋转到P’,角度为θ,若是由P’转到P,则角度为-θ)。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
于是可得下面的转换方程

在这里插入图片描述(式一)

写成矩阵的形式就是
在这里插入图片描述
求得旋转矩阵为
在这里插入图片描述

由于这里使用齐次坐标,所以还需加上一维,最终变成如下形式(绕Z轴旋转矩阵)
在这里插入图片描述

和前面给出的绕Z轴旋转矩阵完全吻合。

对于绕X轴旋转的情况,我们只需将式一中的x用y替换,y用z替换,z用x替换即可。替换后得到
在这里插入图片描述(式二)
对应的旋转矩阵为(绕X轴旋转矩阵):
在这里插入图片描述

对于绕Y轴旋转的情况,只需对式二做一次同样的替换即可,的到的变换方程为
在这里插入图片描述
对应的变换矩阵为(绕Y轴旋转矩阵):
在这里插入图片描述

逆矩阵

平移变换矩阵的逆矩阵与原来的平移量相同,但是方向相反。
在这里插入图片描述
旋转变换矩阵的逆矩阵与原来的旋转轴相同但是角度相反。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
缩放变换的逆矩阵正好和原来的效果相反,如果原来是放大,则逆矩阵是缩小,如果原来是缩小,则逆矩阵是放大。
在这里插入图片描述

作者:zdd
出处:http://www.cnblogs.com/graphics/


动动小手

#include "rotate.h"

bool rotate_Z(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_rotated, float theta)
{
	/* Reminder: how transformation matrices work :
	|-------> This column is the translation
	| cos(theta) -sin(theta) 0 x |  \
	| sin(theta)  cos(theta) 0 y |   }-> The identity 3x3 matrix (Z axis) on the left
	| 0           0          1 z |  /
	| 0           0          0 1 |    -> We do not use this line (and it has to stay 0,0,0,1)

	This is the "manual" method, perfect to understand but error prone !
	*/

	Eigen::Matrix4f transform = Eigen::Matrix4f::Identity();
	//float theta = M_PI / 2;
	transform(0, 0) = cos(theta);
	transform(0, 1) = -sin(theta);
	transform(1, 0) = sin(theta);
	transform(1, 1) = cos(theta);
	pcl::transformPointCloud(*cloud, *cloud_rotated, transform);
	
	return true;
}

bool rotate_X(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_rotated, float theta)
{
	/* Reminder: how transformation matrices work :
	|-------> This column is the translation
	| 1 0           0          x |  \
	| 0 cos(theta)  sin(theta) y |   }-> The identity 3x3 matrix (X axis) on the left
	| 0 -sin(theta) cos(theta) z |  /
	| 0 0           0          1 |    -> We do not use this line (and it has to stay 0,0,0,1)

	This is the "manual" method, perfect to understand but error prone !
	*/

	Eigen::Matrix4f transform = Eigen::Matrix4f::Identity();
	//float theta = M_PI / 2;
	transform(1, 1) = cos(theta);
	transform(1, 2) = sin(theta);
	transform(2, 1) = -sin(theta);
	transform(2, 2) = cos(theta);
	pcl::transformPointCloud(*cloud, *cloud_rotated, transform);

	return true;
}

bool rotate_Y(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_rotated, float theta)
{
	/* Reminder: how transformation matrices work :
	|-------> This column is the translation
	| cos(theta) 0          -sin(theta) x |  \
	| 0          1          0           y |   }-> The identity 3x3 matrix (Y axis) on the left
	| sin(theta) 0          cos(theta)  z |  /
	| 0          0          0           1 |    -> We do not use this line (and it has to stay 0,0,0,1)

	This is the "manual" method, perfect to understand but error prone !
	*/

	Eigen::Matrix4f transform = Eigen::Matrix4f::Identity();
	//float theta = M_PI / 2;
	transform(0, 0) = cos(theta);
	transform(0, 2) = -sin(theta);
	transform(2, 0) = sin(theta);
	transform(2, 2) = cos(theta);
	pcl::transformPointCloud(*cloud, *cloud_rotated, transform);

	return true;
}
基于OpenCv的图像几何变换 阅读详情

相关推荐

MATLAB中的几何变换

一、基本介绍与应用 MATLAB在数字图像处理中有很多几何变换的函数,以下为基本例子 首先读取原图像再一次进行几何变换 P=imread('picture1.png'); 1、图像旋转 imrotate(picture,angle,‘bilinear’or’nearest’); q其中picture是图像储存的矩阵,angle为旋转角度,顺时针为负,逆时针为正 p_rotate=imrotat...

屋顶数☆☆的博客 1583

几何变换整理

整理了各种几何变换:刚体变换、相似变换、仿射变换、投影变换

Goodness2020的博客 5736

几何变换(图像平移,,垂直镜像,水平镜像,图像转置,缩放,旋转)

几何变换(图像平移,,垂直镜像,水平镜像,图像转置,缩放,旋转)

计算机视觉基础(2)-几何变换

文章目录1、 平移变换(Translation)1、二维空间2、三维空间2、 缩放变换(Scaling)1、二维空间2、三维空间3、 旋转变换(Rotation)1、 向量旋转1.1 平面二维旋转1.2 三维旋转1.3 助记2、 坐标系旋转2.1平面二维旋转2.2 三维旋转 在三维图形学中,几何变换大致分为三种,平移变换(Translation),缩放变换(Scaling),旋转变换(Rotation)。 1、 平移变换(Translation) 1、二维空间 在二维空间中一个点[x,y],移动到另一个点[

Destiny_的博客 2298

QGIS效率提升神器:qgis_mcp插件+VSCode联合工作流配置全解析

本文详细解析了如何通过配置qgis_mcp插件与VSCode的联合工作流,实现语音控制和代码自动化来大幅提升QGIS操作效率。该方案将自然语言交互与现代编辑器生态结合,为地理信息专业人士构建了智能、高效的全新工作模式,彻底改变传统GIS操作方式。

weixin_29228203的博客 189

Pulpino SoC中挂载AXI从机接口的自定义IP说明

AXI 从机接口挂载 Pulpino SoC 调试Pulpino SoC中挂载AXI从机接口的自定义IP说明PULPion SoC介绍自定义AXI IP挂载IP挂载框图代码修改脚本修改自定义AXI IP调试C语言编写软件调试硬件调试 Pulpino SoC中挂载AXI从机接口的自定义IP说明 本篇文章主要从工程的角度描述了如何将具有AXI从机接口的自定义IP挂载到Pulpino SoC上,其中不涉及到SoC中的任何原理知识。 PULPion SoC介绍 PULPion SoC整体架构如下图所示, PULPi

小陈的芯片学习之路 2210

几何变换详解

在三维图形学中,几何变换大致分为三种,平移变换(Translation),缩放变换(Scaling),旋转变换(Rotation)。以下讨论皆针对DirectX,所以使用左手坐标系。 平移变换 将三维空间中的一个点[x, y, z, 1]移动到另外一个点[x', y', z', 1],三个坐标轴的移动分量分别为dx=Tx, dy=Ty, dz=Tz, 即 x' = x + Tx y' = ...

weixin_34106122的博客 664

EEGLAB+ERPLAB实战:从.cnt文件到情绪ERP差异波,一份避坑指南

本文详细介绍了使用EEGLAB和ERPLAB处理Neuroscan的.cnt格式脑电数据的全流程,从数据导入、预处理到情绪ERP差异波生成。重点解决了采样率验证、事件标记检查、重参考选择、滤波策略与ICA组合等实操难题,并提供了情绪图片ERP研究中P1、EPN和LPP成分的分析技巧,帮助研究者避免常见错误,提升数据处理效率。

weixin_26795617的博客 264

图像的几何变换

本文全面探讨了图像几何变换在计算机视觉和图像处理中的重要性,涵盖其数学基础、应用场景及对图像信息的影响。几何变换通过变换矩阵(如平移、旋转、缩放)实现,采用齐次坐标和矩阵乘法组合复杂操作。应用包括数据增强(提升深度学习模型鲁棒性)、图像注册(医学与遥感对齐)、视图变换(计算机图形学)等。变换可能导致信息保留或丢失,影响特征分布,同时增强CNN和GAN的性能。文章详细分析了平移(矩阵表示、边界处理)和旋转(公式、插值方法如最近邻、双线性、双三次)的原理与应用,强调其在图像拼接、视觉效果及特征提取中的作用。

qq_53529450的博客 1023

GAN网络(论文阅读):Generative Adversarial Nets

当判别器效果比较好时,D(G(z))值为0,则log(1-D(G(z)))值为0,当判别器效果不好,会输出一个大于0 的数,则log(1-D(G(z)))值就为一个负数,在极端情况下,会得到负无穷大,此时判别失误。在价值函数的第二项中存在问题,在早期G比较弱的时,生成的数据和真实数据相差很大,D就容易训练的比较好,很容易区分,就会导致log(1-D(G(z)))变成0 ,这样很难求梯度来优化G,所以更新G时,将优化函数改为log(D(G(z)))。最终使G赢,即G生成的数据D判别不出来。

m0_54248968的博客 2292

PyCharm中Pyvips配置避坑指南:为什么pip安装后import还是报错?

本文详细解析了在PyCharm中配置Pyvips时,即使pip安装成功,import仍报错的根本原因。核心在于Pyvips依赖的libvips原生库未正确配置环境变量。文章提供了从下载libvips、配置Windows系统PATH到PyCharm项目级设置的完整避坑指南,并对比了三种配置策略,帮助开发者彻底解决DLL加载失败问题。

bush的博客 209

opencv之几何变换

几何变换是计算机图像处理中的一种操作,用于对图像的几何结构进行修改。通过几何变换,可以实现图像的旋转、缩放、平移、扭曲等效果,从而改变图像的形状、位置和方向。这些变换可以是线性的或非线性的,通常使用数学矩阵来表示和计算。一般公式dstxysrcM11⋅xM12⋅yM13M21⋅xM22⋅yM23dstxysrcM11​⋅xM12​⋅yM13​M21​⋅xM22​⋅yM23​xy。

hola173841439的博客 1806

23. STM32F103C8T6 ADC采集光敏电阻传感器模块光照强度实战

本文详细介绍了如何使用STM32F103C8T6的ADC模块采集光敏电阻传感器的光照强度。通过硬件接线、核心原理讲解、四步代码配置(GPIO、ADC模式、使能校准、数据滤波)以及串口验证,手把手指导完成从模拟信号到数字值的完整实战流程,并重点提示了ADC时钟分频等关键配置要点。

weixin_42300144的博客 220

opengl二维几何变换实例

opengl二维几何变换 opengl提供的几何变换函数和绘图函数是完全分开的,并没有指定一个变换矩阵然后再绘图的API。 opengl是先使用几何变换函数,此时相当于永久改变了坐标系,此后的所有绘图操作都相当于在新坐标系下进行。 如 glTranslatef(100, 100, 0); 相当于把当前坐标轴向x轴正向和y轴正向同时移动100个单位,此后所有的绘图函数都参照此新坐标系进行。此时如果在新坐标系原点绘制一个点,相当于在原坐标系的(100,100)处绘制一个点 opengl一共有四个矩阵栈,应用于不

o83290102o5的博客 5778

环境配置与基础教程:当前大厂主流套路:使用 MLflow 全链路管理 YOLO 实验参数、指标与模型版本

YOLO26与MLflow结合实现高效实验管理 YOLO26通过移除DFL模块和实现无NMS端到端推理,在CPU推理速度上提升43%,同时简化了模型导出流程。MLflow 3.10/3.11版本新增多工作区支持、成本追踪和安全序列化等功能,为机器学习实验提供全生命周期管理。两者结合可解决传统"截图+Excel"式实验管理的痛点,实现参数追踪、指标对比和模型版本控制的自动化。 关键优势: YOLO26架构优化带来显著性能提升 MLflow提供实验到生产的全链路管理 原生集成简化了计算机视觉

ZXSXJ的博客 191

【深度学习新浪潮】为什么OpenClaw这么吃token?

OpenClaw 高 Token 消耗的核心是 Agent 多轮思考、工具调用上下文累积,以及平台内置的模板/多模型协同开销;PD 分离在 OpenClaw 中可针对性解决长上下文 Prefill 阻塞、KV Cache 复用低效问题,是提升其推理效率的核心优化手段,主要落地在长上下文处理与生成阶段解耦、KV Cache 集中管理、动态资源调度三个方向。

专注:太空算力、AI infra、异构调度、大模型成本工程 419

二维几何变换

图像的几何变换主要包含:刚性变换(rigidity)、相似变换(similarity)、仿射变换(affine)、投影变换(projective)、透视变换。这里我们主要介绍二维坐标系下的三种几何变换:刚性变换、相似变换、仿射变换,三者之间的关系如下图所示: 一、刚性变换 刚性变换的最重要特点就是变换前后目标 任意两点间距离不变,包含平移、旋转、翻转(镜像)三种。 1、平移 Halcon中向齐次变换矩阵添加平移分量的算子有以下两个: (1)相对于全局(即固定)坐标系执行平移 hom_mat2

贾路飞的博客 3835

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

opencv的几何变换

图像的几何变换就是将一组图像数据经过某种数学运算,映射成另外一组图像数据的操作。所以,

m0_57882236的博客 1997

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

三维图形几何变换

同二维变换类似,三维变换同样引入了齐次坐标技术,在四维空间(x,y,z,w)内进行讨论。定义了规范化齐次坐标以后,三维图形几何变换就可以表示为物体顶点集合的规范化齐次坐标矩阵与某一变换矩阵相乘的形式。用规范化齐次坐标表示的三维图形几何变换矩阵是一个4×4方阵,简称为三维几何变换矩阵。 T=⎡⎣⎢⎢⎢adglbehmcfinpqrs⎤⎦⎥⎥⎥T=[abcpdefqghirlmns] T=\lef...

姜希成的博客 2894

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【OpenCV】几何变换

几何变换(Geometric Transformations)在图像处理和计算机视觉领域中扮演着重要角色,它们用于改变图像的大小、形状或位置。OpenCV 提供了多种函数来执行不同类型的几何变换,如平移、旋转、缩放、仿射变换和透视变换等。下面将详细介绍这些常见的几何变换及其在 OpenCV 中的应用。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 7950

简单几何变换

简单几何变换几何表示2D几何变换translation 平移rotation+transform (平移+旋转)刚性变换Similarity相似变换(旋转+按比缩放+平移)Affine放射变换projective 投影影变换(透视变换、同态映射)3D几何变换 几何变换就是空间变换,是图形学的基础算法,在计算机视觉中应用也比较广泛。本文就简单介绍集中基础几何变换 几何表示 2D几何变换 “名场面”如...

FH的博客 1158

python图像处理的图像几何变换

本章主要讲解Python和OpenCV的图像几何变换,详细介绍了图像平移、图像缩放和图像旋转,这些知识点也是我们PC端或手机端图像处理应用常见的算法,读者可以尝试结合这些应用完成一套图像处理软件。

s44359487yad的博客 2047

Open CV:几何变换

仿射变换可以用以下数学形式表示:其中:是输入点的坐标。是变换后的点的坐标。是变换矩阵的元素,控制缩放、旋转和剪切。和是平移的距离。可以将仿射变换用一个 2×3 的矩阵透视变换可以通过一个 3x3 的矩阵来描述。其一般形式如下:其中,变换矩阵以上是几何变换的一些基本操作和实现示例。通过这些变换,可以实现图像的平移、旋转、缩放、仿射和透视效果,非常适合用于图像处理和分析。

Wei_sx的博客 1264

图像处理 几何变换

I have to remind myself that some birds don’t mean to be caged . Their feathers are just too bright. And when they fly away, the part of you that knows it was a sin to lock them up. DOES rejoice. Sti...

Notzuonotdied的博客 3550

HALCON几何变换

深入浅出HALCON几何变换 在机器视觉系统中,镜头是重要成像部件之一,而基于小孔成像原理的工业镜头往往会产生透视畸变现象,如何校正畸变是进行图像分析的前提,这其中就会用到投影变换,也是几何变换的一种。除此之外,图像处理中常用到的平移、旋转、缩放等,也属于几何变换。本文将通过实例详细介绍HALCON中的几何变换。 基础知识 齐次坐标(Homogenous Coordinat...

Luckboy_shy的博客 2817
上一篇: static关键字总结
下一篇: Graph Neural Networks: A Review of Methods and Applications(Semantic Segmentation应用解读)
君只见独不见
博客等级 码龄12年 99粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值