Affine Transform&Projection

本文详细介绍了仿射变换(AffineTransform)与投影变换(Projection)的基本概念及应用实例。仿射变换涵盖向量的旋转、缩放和平移等操作,而投影变换则涉及从多维空间到其子空间的映射过程。
部署运行你感兴趣的模型镜像

1. Affine Transform 仿射变换

放射变换(又称仿射映射):在几何中,一个向量空间进行一次线性变换并接上一个平移,变换到另一个向量空间

eg:对向量 \vec{x}  平移 \vec{b} ,与旋转缩放矩阵 A 的仿射变换为

\vec{y} = A \vec{x} + \vec{b}.

在齐次坐标上,也可以表示为

\begin{bmatrix} \vec{y} \\ 1 \end{bmatrix} = \begin{bmatrix} A & \vec{b} \ \\ 0, \ldots, 0 & 1 \end{bmatrix} \begin{bmatrix} \vec{x} \\ 1 \end{bmatrix}

收缩平移仿射映射可以制造具有自相似性的分形


2. Projection 投影

投影:从向量空间映射到自身的一种线性变换(将整个向量空间映射到它的其中一个子空间,并且在这个子空间中是恒等变换)。

eg:假设阳光是沿着同一个方向(比如说垂直于地面的角度)照射而来,大地是严格的平面,那么对于任何一个物体,它的位置可以用向量(x, y, z)来表示,而这个物体在阳光下对着一个影子,也就是(x, y, 0),这样的一个变换就是投影变幻,它将三维空间中的向量(x, y, z)投影到向量(x, y, 0)。

变换矩阵可以表示为

 P = \begin{bmatrix} 1 & 0 & 0 \\  0 & 1 & 0 \\  0 & 0 & 0 \end{bmatrix}.

对任意一个向量(x, y, z),矩阵P的作用是:

 P \begin{pmatrix} x \\ y \\ z \end{pmatrix} = \begin{pmatrix}x \\ y \\  0 \end{pmatrix}


对affine transform和projection最简单形象的理解为前者为对向量vector进行旋转,缩放,平移等操作;后者则是将多维空间映射到其子空间中。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

#pragma once #include <opencv2/opencv.hpp> #include <vector> #include <Eigen/Eigen> #include <pcl/point_cloud.h> #include <pcl/point_types.h> #include <vtkTransform.h> #include <vtkBoxRepresentation.h> // 用于提取包围盒尺寸信息(若需要) // 投影结果结构体 struct ProjResult { cv::Mat img; // 投影图像 std::vector<cv::Point> obb_corners; // OBB像素角点 cv::Point obb_center; // OBB中心像素坐标 }; // 面类型枚举(仅保留X+、Y+、Z+面) enum class FaceType { X_POS, // X+面(垂直于局部X轴正方向) Y_POS, // Y+面(垂直于局部Y轴正方向) Z_POS // Z+面(垂直于局部Z轴正方向) }; // OBB数据结构体 struct ObbData { float pos_x, pos_y, pos_z; // 中心点坐标 float rot_x, rot_y, rot_z; // 旋转角(弧度) float scale_x, scale_y, scale_z; // 尺寸 std::string obj_type; // 对象类型 }; // 内存级接口:新增use_all_points参数控制投影范围 // use_all_points = true: 投影全部点云 // use_all_points = false: 仅投影OBB内点云(默认行为) int get_proj_results( const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& cloud, const std::vector<ObbData>& obb_data, ProjResult* results, bool use_all_points = false // 新增参数:控制投影范围 ); // 文件级接口:新增use_all_points参数 int gen_proj_images( const char* pcd_path, const char* json_path, bool use_all_points = false // 新增参数:控制投影范围 ); // 释放投影结果内存 void free_proj_results( ProjResult* results ); // 内部辅助类和函数 namespace Internal { class OrientedBBox { public: Eigen::Vector3f center; Eigen::Vector3f extent; Eigen::Affine3f transform; OrientedBBox() : center(Eigen::Vector3f::Zero()), extent(Eigen::Vector3f::Zero()), transform(Eigen::Affine3f::Identity()) {} OrientedBBox(Eigen::Vector3f center, Eigen::Vector3f dimensions, Eigen::Affine3f transform_to_local) { this->center = center; this->extent = dimensions; transform_to_local.translation() = this->center; this->transform = transform_to_local.inverse(); } // 从vtkTransform构造 // 从vtkTransform构造(直接嵌入转换逻辑,不依赖外部函数) OrientedBBox(vtkTransform* vtkTrans) { if (!vtkTrans) { center = Eigen::Vector3f::Zero(); extent = Eigen::Vector3f::Zero(); transform = Eigen::Affine3f::Identity(); return; } // 1. 从vtkTransform提取4x4矩阵,转换为Eigen::Affine3f vtkMatrix4x4* vtkMat = vtkTrans->GetMatrix(); // 获取VTK变换矩阵 Eigen::Matrix4f eigenMat; // 初始化Eigen矩阵 // 逐元素复制(VTK和Eigen均为列优先存储) for (int row = 0; row < 4; ++row) { for (int col = 0; col < 4; ++col) { eigenMat(row, col) = static_cast<float>(vtkMat->GetElement(row, col)); } } transform = Eigen::Affine3f(eigenMat); // 转换为仿射变换 // 2. 提取中心(变换的平移分量) center = transform.translation(); // 3. 提取缩放作为extent double scale[3]; vtkTrans->GetScale(scale); // 获取VTK变换的各轴缩放系数 extent = Eigen::Vector3f( static_cast<float>(scale[0]), static_cast<float>(scale[1]), static_cast<float>(scale[2]) ); } // 新增:将OrientedBBox的变换转换为vtkTransform vtkTransform* to_vtk_tansform() const { // 1. 从Eigen::Affine3f提取4x4矩阵 const Eigen::Matrix4f& eigenMat = transform.matrix(); vtkMatrix4x4* vtkMat = vtkMatrix4x4::New(); // 创建VTK矩阵 // 逐元素复制 for (int row = 0; row < 4; ++row) { for (int col = 0; col < 4; ++col) { vtkMat->SetElement(row, col, eigenMat(row, col)); } } // 2. 关联到vtkTransform vtkTransform* vtkTrans = vtkTransform::New(); vtkTrans->SetMatrix(vtkMat); // VTK会内部复制矩阵数据 // 释放中间矩阵 // vtkMat->Delete(); return vtkTrans; } std::vector<int> get_points_in_box(const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& cloud) const; std::vector<Eigen::Vector3f> get_corners() const; Eigen::Matrix3f get_axes() const; Eigen::Affine3f get_global_to_local() const; Eigen::Affine3f get_local_to_global() const; bool get_face_info(FaceType face, std::vector<Eigen::Vector3f>& out_vertices, Eigen::Vector3f& out_center) const; bool get_face_local_axes(FaceType face, Eigen::Vector3f& out_u, Eigen::Vector3f& out_v, Eigen::Vector3f& out_n) const; OrientedBBox rotate_around_face_normal(FaceType face, float theta_deg) const; }; OrientedBBox parse_obb(const std::vector<ObbData>& obb_data); cv::Mat gen_proj_internal( const pcl::PointCloud<pcl::PointXYZ>::ConstPtr& local_cloud, const OrientedBBox& obb, const Eigen::Vector3f& cam_pos, std::vector<cv::Point>& out_corners, cv::Point& out_center, float cam_rot_deg = 0.0f ); } PointCloudProjection.h 已经有了 给出mainwindow.h .cpp 这个文件是小写的
最新发布
10-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值