PCL可视化窗口的键盘控制

在使用PCL点云库进行可视化的时候,可以通过键盘控制显示情况,在可视化窗口按h键可以查看。
在这里插入图片描述
然后分析不同按键选项的功能,字母按键都是不区分大小写的。

首先假定可视化窗口中除了点云(白色),还有我们添加的其他图形样式(红色),比如障碍物边框、表示距离的圆和其他图形等。
在这里插入图片描述

p:转换到基于点的表现形式。就是清除了点云之外的自己添加的各种样式,包括各种图形、线条等,但是保存了关键点信息。比如原图形中的长方体边框,在使用p键后长方体消失,但是8个顶点还是保留的(图中看不清)。
在这里插入图片描述

w:转换到基于线框的表现形式。和最初的表现样式相同,显示图形的边框、圆形。

s:转换到基于表面的表现形式。圆形线显示,长方体边框变为封闭图形。
在这里插入图片描述

j:截图并且会自动保存。

c:显示当前的相机/窗口参数。并且在终端显示

### 实现PCL可视化交互并平移Mesh 在PCL中,`pcl::visualization::PCLVisualizer` 提供了强大的交互功能,允许用户通过键盘或鼠标事件来控制场景中的对象。对于实现Mesh的平移操作,可以通过注册回调函数捕获用户的输入,并动态修改Mesh的位置。 以下是完整的代码示例以及详细的解释: #### 示例代码 ```cpp #include <iostream> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> bool updateFlag = false; float translationX = 0.0f, translationY = 0.0f; void keyboardEventOccurred(const pcl::visualization::KeyboardEvent& event, void* viewer_void) { if (event.getKeySym() == "Up" && event.keyDown()) { translationY += 0.1f; // 向上移动 updateFlag = true; } if (event.getKeySym() == "Down" && event.keyDown()) { translationY -= 0.1f; // 向下移动 updateFlag = true; } if (event.getKeySym() == "Left" && event.keyDown()) { translationX -= 0.1f; // 向左移动 updateFlag = true; } if (event.getKeySym() == "Right" && event.keyDown()) { translationX += 0.1f; // 向右移动 updateFlag = true; } } int main(int argc, char** argv) { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("point_cloud.pcd", *cloud); pcl::visualization::PCLVisualizer viewer("PCL Viewer"); viewer.setBackgroundColor(0, 0, 0); viewer.addPointCloud(cloud, "sample cloud"); // 添加一个三角形网格作为测试模型 std::vector<float> vertices = {0, 0, 0, 1, 0, 0, 0, 1, 0}; std::vector<int> triangles = {0, 1, 2}; viewer.addTriangleStrip(vertices, triangles, "triangle strip"); // 注册键盘事件回调 viewer.registerKeyboardCallback(keyboardEventOccurred, nullptr); while (!viewer.wasStopped()) { if (updateFlag) { // 更新Mesh位置 Eigen::Affine3f transform = Eigen::Affine3f::Identity(); transform.translation() << translationX, translationY, 0.0f; viewer.updatePolygonMesh(transform); // 假设存在此方法用于更新变换矩阵 updateFlag = false; } viewer.spinOnce(); // 刷新窗口 } return 0; } ``` #### 解释 上述代码实现了以下功能: 1. **加载点云数据**:从文件 `point_cloud.pcd` 中读取点云数据[^1]。 2. **创建视觉化窗口**:初始化 `PCLVisualizer` 对象,并设置背景颜色为黑色[^2]。 3. **添加几何体**:将点云和一个简单的三角形网格加入到可视化窗口中[^1]。 4. **注册键盘事件**:当按下上下左右键时,分别改变全局变量 `translationX` 和 `translationY` 的值[^2]。 5. **实时更新Mesh位置**:每次检测到键盘事件触发后,重新计算 Mesh 的变换矩阵并通过 `Eigen::Affine3f` 应用位移[^2]。 需要注意的是,在实际应用中可能需要调用更具体的 API 来完成对 Polygon 或 Triangle Strip 的精确更新操作。 --- ### 相关问题
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值