目标点云旋转、平移

1.来源

PCL 点云变换_pcl点云缩放-CSDN博客

PCL 仿射变换,实现点云平移旋转_点云仿射变换-CSDN博客

2.

xyz平移

transform.cpp

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/common/transforms.h>  //  pcl::transformPointCloud 用到这个头文件
#include <pcl/common/common_headers.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

using namespace std;
int
main(int argc, char** argv) {

    // 加载点云数据文件
    pcl::PointCloud<pcl::PointXYZ>::Ptr source(new pcl::PointCloud<pcl::PointXYZ>());
    pcl::io::loadPCDFile<pcl::PointXYZ>("0001_1.pcd", *source);
    // 平移
    Eigen::Isometry3d T = Eigen::Isometry3d::Identity(); // 定义变换矩阵
    Eigen::Vector3d translation(1.0, 0.3,0);  
    
    
    //0001_1=======1.0, 0.3,0 /         
    //0002_1=======0.1  0.1  25
    
    T.pretranslate(translation);       
    // 执行平移变换,并将结果保存在新创建的 t_cloud 中
    pcl::PointCloud<pcl::PointXYZ>::Ptr t_cloud(new pcl::PointCloud<pcl::PointXYZ>());
    pcl::transformPointCloud(*source, *t_cloud, T.matrix());
    pcl::io::savePCDFileASCII("0001_11.pcd", *t_cloud);


    cout << "原始点云显示为白色,变换后的点云为红色" << endl;
	pcl::visualization::PCLVisualizer viewer("Affine3f transformation example");

	// 为点云定义 R,G,B 颜色
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_cloud_color_handler(source, 0, 0, 255);
	// 输出点云到查看器,使用颜色管理
	viewer.addPointCloud(source ,source_cloud_color_handler, "original_cloud");

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler(t_cloud, 255, 0, 0); // 红
	viewer.addPointCloud(t_cloud, transformed_cloud_color_handler, "transformed_cloud");
	viewer.setBackgroundColor(255, 255, 255, 0); // 设置背景为深灰
	viewer.addText("The original point cloud is white,the transformed point cloud is red", 20, 20, "text");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "original_cloud");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "transformed_cloud");
	//viewer.setPosition(800, 400); // 设置窗口位置
	// 启动可视化
    //viewer.addCoordinateSystem(0.2);  //显示XYZ指示轴
    //viewer.initCameraParameters();   //初始化摄像头参数


	while (!viewer.wasStopped()) { // 在按下 "q" 键之前一直会显示窗口
		viewer.spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(10000));
	}






    return (0);
}



进行编译

3.旋转

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/common/transforms.h>  //  pcl::transformPointCloud 用到这个头文件
#include <pcl/common/common_headers.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

using namespace std;

int
main(int argc, char** argv) {

	// 加载点云数据文件
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
	pcl::io::loadPCDFile("0002_1.pcd", *cloud);

	Eigen::Affine3f transform = Eigen::Affine3f::Identity();//初始化变换矩阵为单位矩阵
	// 在 X 轴上定义一个 1米的平移.
	transform.translation() << 1.0, 0.0, 0.0;

	// 旋转; X轴旋转45°, Y轴上旋转0°,Z轴上旋转0°
	float angle_x = 0;
	float angle_y = 0;
	float angle_z = 10;

//1: 0005_1: angle_x = 45
//2:0015_1:angle_y = 45
//3:0002_1:angle_z = 10


	// 国际单位制中,弧度是角的度量单位,Eigen中也是以弧度作为角度量单位,
	// 因此需要将角度值转换为弧度制
	transform.rotate(Eigen::AngleAxisf(pcl::deg2rad(angle_x), Eigen::Vector3f::UnitX()));
	transform.rotate(Eigen::AngleAxisf(pcl::deg2rad(angle_y), Eigen::Vector3f::UnitY()));
	transform.rotate(Eigen::AngleAxisf(pcl::deg2rad(angle_z), Eigen::Vector3f::UnitZ()));
	// 打印变换矩阵
	cout << "变换矩阵为:\n" << transform.matrix() << endl;

	// 执行变换,并将结果保存在新创建的 transformed_cloud 中
	pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud(new pcl::PointCloud<pcl::PointXYZ>());
	pcl::transformPointCloud(*cloud, *transformed_cloud, transform);
	pcl::io::savePCDFileASCII("0002_11.pcd", *transformed_cloud);

	cout << "原始点云显示为白色,变换后的点云为红色" << endl;
	pcl::visualization::PCLVisualizer viewer("Affine3f transformation example");

	// 为点云定义 R,G,B 颜色
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_cloud_color_handler(cloud, 0, 0, 255);
	// 输出点云到查看器,使用颜色管理
	viewer.addPointCloud(cloud, source_cloud_color_handler, "original_cloud");

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler(transformed_cloud, 255, 0, 0); // 红
	viewer.addPointCloud(transformed_cloud, transformed_cloud_color_handler, "transformed_cloud");
	viewer.setBackgroundColor(255, 255, 255, 0); // 设置背景为深灰
	viewer.addText("The original point cloud is white,the transformed point cloud is red", 20, 20, "text");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "original_cloud");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "transformed_cloud");
	//viewer.setPosition(800, 400); // 设置窗口位置
	// 启动可视化
    //viewer.addCoordinateSystem(0.2);  //显示XYZ指示轴
    //viewer.initCameraParameters();   //初始化摄像头参数


	while (!viewer.wasStopped()) { // 在按下 "q" 键之前一直会显示窗口
		viewer.spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(1000));
	}

	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 图像平移旋转是数字图像处理中常见的操作。使用FFT算法可以实现快速的图像平移旋转。下面是一个基于FFT的图像平移旋转实验的步骤: 1. 读取一幅图像,将图像转换为灰度图像。 2. 对灰度图像进行FFT变换。 3. 计算图像的中心点坐标,并将频谱中心移动到图像中心。 4. 对图像进行平移操作,平移的距离可以通过设置平移向量来实现。 5. 对图像进行旋转操作,旋转的角度可以通过设置旋转矩阵来实现。 6. 对旋转后的图像进行IFFT变换,得到平移旋转后的图像。 7. 显示平移旋转后的图像。 下面是一个示例代码: ``` python import cv2 import numpy as np # 读取图像并转换为灰度图像 img = cv2.imread('lena.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 对灰度图像进行FFT变换 f = np.fft.fft2(gray) fshift = np.fft.fftshift(f) # 计算中心点坐标 rows, cols = gray.shape crow, ccol = int(rows/2), int(cols/2) # 平移向量 tx, ty = 50, 50 # 构建平移矩阵 M = np.float32([[1, 0, tx], [0, 1, ty]]) # 平移图像 fshift_trans = cv2.warpAffine(fshift, M, (cols, rows)) # 旋转角度 angle = 30 # 构建旋转矩阵 M = cv2.getRotationMatrix2D((ccol, crow), angle, 1) # 旋转图像 fshift_rot = cv2.warpAffine(fshift, M, (cols, rows)) # 将频谱中心移动到图像中心 fshift_center = fshift_trans[crow-100:crow+100, ccol-100:ccol+100] fshift_rot_center = fshift_rot[crow-100:crow+100, ccol-100:ccol+100] # 对平移后的频谱进行IFFT变换 img_trans = np.fft.ifft2(np.fft.ifftshift(fshift_center)).real img_trans = np.uint8(img_trans) # 对旋转后的频谱进行IFFT变换 img_rot = np.fft.ifft2(np.fft.ifftshift(fshift_rot_center)).real img_rot = np.uint8(img_rot) # 显示平移旋转后的图像 cv2.imshow('gray', gray) cv2.imshow('img_trans', img_trans) cv2.imshow('img_rot', img_rot) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们使用了`cv2.warpAffine()`函数来实现平移旋转操作。`cv2.warpAffine()`函数需要传入一个变换矩阵,该变换矩阵可以通过`cv2.getRotationMatrix2D()`函数来获取。平移矩阵可以通过构造一个2x3的矩阵来实现。在变换完图像之后,我们需要将频谱中心移动到图像中心,并进行IFFT变换,得到平移旋转后的图像。最后,我们使用OpenCV的`cv2.imshow()`函数显示图像。 ### 回答2: 基于FFT的图像平移旋转实验是一种基于快速傅里叶变换(FFT)的图像处理方法,用于实现图像的平移旋转操作。FFT是一种将信号从时域转换为频域的算法,通过分析信号的频谱来获取信号的特征。 在图像平移实验中,首先将待平移的图像进行傅里叶变换,得到频谱图。然后通过改变频谱图的相位信息来实现图像的平移。具体来说,可以通过将频谱图中的相位调整为相应平移距离的相位信息,然后进行傅里叶逆变换,最终得到平移后的图像。 在图像旋转实验中,同样先对待旋转的图像进行傅里叶变换,得到频谱图。然后通过改变频谱图的相位信息来实现图像的旋转。具体而言,可以通过将频谱图中的相位信息进行逆时针旋转,然后进行傅里叶逆变换,最终得到旋转后的图像。 借助FFT的高效计算能力和频谱分析特性,基于FFT的图像平移旋转实验可以实现复杂的图像处理操作。同时,FFT还具有可逆性,即平移旋转后的图像可以通过逆变换得到原始图像,这也是FFT算法在数字图像处理中的重要应用之一。 总结来说,基于FFT的图像平移旋转实验是一种利用快速傅里叶变换算法来实现图像平移旋转的图像处理方法。通过改变频谱图的相位信息来实现平移旋转操作,进而实现对图像的处理和变换。 ### 回答3: 基于FFT的图像平移旋转实验是一种图像处理的方法,利用离散傅里叶变换(FFT)来实现对图像的平移旋转操作。通过将图像转换到频域进行处理,可以快速高效地实现平移旋转操作,同时可以避免由于像素插值等原因引起的图像质量损失。 在实验中,首先将原始图像进行傅里叶变换,得到其频谱表示。然后,在频谱上进行平移旋转操作,可以通过调整频域中图像的相位信息来实现。平移操作可通过将频域图像的中心移动到目标位置来实现,旋转操作则可通过将频域图像进行旋转变换来实现。最后,将变换后的频域图像进行逆傅里叶变换,得到平移旋转后的图像。 基于FFT的图像平移旋转实验具有以下优点: 1. 运算速度快:FFT算法能够在频域对图像进行高效的计算,大大提高了计算速度。 2. 保持图像质量:由于FFT方法不需要进行像素插值等操作,可以避免图像质量损失。 3. 精确性高:FFT方法能够精确地实现图像的平移旋转操作。 然而,基于FFT的图像平移旋转实验也存在一些限制: 1. 复杂度较高:对于大型图像,FFT的计算量较大,可能需要较多的计算资源。 2. 图像尺寸受限:由于FFT算法要求输入图像的尺寸为2的幂次方,因此对于非2的幂次方尺寸的图像需要进行零值填充或裁剪处理。 总之,基于FFT的图像平移旋转实验是一种高效、准确的图像处理方法。通过使用FFT算法,可以实现对图像的平移旋转,同时保持图像质量。然而,对于大型图像和非2的幂次方尺寸图像,需要考虑计算复杂度和图像处理的适用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值