程序示例精选
PCL+C++点云窗体显示实例
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!
这篇博客针对<
#include
#include "ui_PointCloudVision.h"
#include //点云数据类型
#include //点云类
#include //点云可视化类
#include //vtk可视化窗口
#include //点云极值
#include "QHeightRampDlg.h" //高度渲染
#include //直通滤波
#include
#include
#include
#include
#include
代码如下:
#include "PointCloudVision.h"
#include
#include
#include
#include
PointCloudVision::PointCloudVision(QWidget* parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//初始化
init();
}
//打开点云
void PointCloudVision::on_action_open_triggered()
{
init();
QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
if (!fileName.isEmpty())
{
std::string file_name = fileName.toStdString();
pcl::PCLPointCloud2 cloud2;
Eigen::Vector4f origin;
Eigen::Quaternionf orientation;
int pcd_version;
int data_type;
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud");
viewer->updatePointCloud(m_currentCloud, "cloud");
// 获取点云数据的最小和最大坐标值
pcl::getMinMax3D(*m_currentCloud, p_min, p_max);
viewer->resetCamera();
ui.qvtkWidget->update();
}
}
//俯视图
void PointCloudVision::on_action_up_triggered()
{
if (!m_currentCloud->empty())
{
viewer->setCameraPosition(0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), p_max.z + 2 * maxLen, 0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), 0, 0, 1, 0);
viewer->updatePointCloud(m_currentCloud, "cloud");
ui.qvtkWidget->update();
on_action_reset_triggered();
}
}
//前视图
void PointCloudVision::on_action_front_triggered()
{
if (!m_currentCloud->empty())
{
viewer->setCameraPosition(0.5 * (p_min.x + p_max.x), p_min.y - 2 * maxLen, 0.5 * (p_min.z + p_max.z), 0.5 * (p_min.x + p_max.x), 0, 0.5 * (p_min.z + p_max.z), 0, 0, 1);
viewer->updatePointCloud(m_currentCloud, "cloud");
ui.qvtkWidget->update();
on_action_reset_triggered();
}
}
//左视图
void PointCloudVision::on_action_left_triggered()
{
if (!m_currentCloud->empty())
{
viewer->setCameraPosition(p_min.x - 2 * maxLen, 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 0, 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 0, 0, 1);
viewer->updatePointCloud(m_currentCloud, "cloud");
ui.qvtkWidget->update();
on_action_reset_triggered();
}
}
//后视图
void PointCloudVision::on_action_back_triggered()
{
if (!m_currentCloud->empty())
{
viewer->setCameraPosition(0.5 * (p_min.x + p_max.x), p_max.y + 2 * maxLen, 0.5 * (p_min.z + p_max.z), 0.5 * (p_min.x + p_max.x), 0, 0.5 * (p_min.z + p_max.z), 0, 0, 1);
viewer->updatePointCloud(m_currentCloud, "cloud");
ui.qvtkWidget->update();
on_action_reset_triggered();
}
}
//右视图
void PointCloudVision::on_action_right_triggered()
{
if (!m_currentCloud->empty())
{
viewer->setCameraPosition(p_max.x + 2 * maxLen, 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 0, 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 0, 0, 1);
viewer->updatePointCloud(m_currentCloud, "cloud");
ui.qvtkWidget->update();
on_action_reset_triggered();
}
}
//底视图
void PointCloudVision::on_action_bottom_triggered()
{
if (!m_currentCloud->empty())
{
viewer->setCameraPosition(0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), p_min.z - 2 * maxLen, 0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), 0, 0, 1, 0);
viewer->updatePointCloud(m_currentCloud, "cloud");
ui.qvtkWidget->update();
on_action_reset_triggered();
}
}
//前轴测
void PointCloudVision::on_action_frontIso_triggered()
{
if (!m_currentCloud->empty())
{
viewer->setCameraPosition(p_min.x - 2 * maxLen, p_min.y - 2 * maxLen, p_max.z + 2 * maxLen, 0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), 1, 1, 0);
viewer->updatePointCloud(m_currentCloud, "cloud");
ui.qvtkWidget->update();
on_action_reset_triggered();
}
}
//后轴测
void PointCloudVision::on_action_backIso_triggered()
{
viewer->setCameraPosition(p_max.x + 2 * maxLen, p_max.y + 2 * maxLen, p_max.z + 2 * maxLen, 0.5 * (p_min.x + p_max.x), 0.5 * (p_min.y + p_max.y), 0.5 * (p_min.z + p_max.z), -1, -1, 0);
viewer->updatePointCloud(m_currentCloud, "cloud");
ui.qvtkWidget->update();
on_action_reset_triggered();
}
//设置点云颜色
void PointCloudVision::on_action_setColor_triggered()
{
QColor color = QColorDialog::getColor(Qt::white, this, "设置点云颜色", QColorDialog::ShowAlphaChannel);
viewer->removeAllPointClouds();
pcl::visualization::PointCloudColorHandlerCustom singleColor(m_currentCloud, color.red(), color.green(), color.blue());
viewer->addPointCloud(m_currentCloud, singleColor, "myCloud", 0);
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, color.alpha() * 1.0 / 255, "myCloud");
ui.qvtkWidget->update();
}
//设置高度渲染
void PointCloudVision::on_action_heightRamp_triggered()
{
heightRampDlg.show();
}
//进行高度渲染
void PointCloudVision::setHeightRamp(int dir, double height)
{
//清空点云
viewer->removeAllPointClouds();
m_heightCloudList.clear();
double min_range = 0;
double max_range = 0;
std::string field = "x";
switch (dir)
{
case 0:
min_range = p_min.x;
max_range = p_max.x;
field = "x";
break;
case 1:
min_range = p_min.y;
max_range = p_max.y;
field = "y";
break;
case 2:
min_range = p_min.z;
max_range = p_max.z;
field = "z";
break;
default:
break;
}
for (double i = min_range - 1; i < max_range + height;)
{
PointCloudT::Ptr cloudTemp(new PointCloudT());
pcl::PassThrough pass; //直通滤波器对象
pass.setInputCloud(m_currentCloud); //输入点云
pass.setFilterFieldName(field); //设置过滤字段
pass.setFilterLimits(i, i + height); //设置过滤范围
pass.setFilterLimitsNegative(false); //设置保留字段
pass.filter(*cloudTemp); //执行滤波
i += height;
m_heightCloudList.append(cloudTemp);
}
//分段渲染
for (int j = 0; j < m_heightCloudList.size(); j++)
{
pcl::visualization::PointCloudColorHandlerGenericField fieldColor(m_heightCloudList.at(j), field);
std::string index = std::to_string(j);
viewer->addPointCloud(m_heightCloudList.at(j), fieldColor, index);
}
}
如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!
1)远程安装运行环境,代码调试
2)Qt, C++, Python入门指导
3)界面美化
4)软件制作
当前文章连接:Python+Qt桌面端与网页端人工客服沟通工具_alicema1111的博客-CSDN博客
博主推荐文章:python人脸识别统计人数qt窗体-CSDN博客
博主推荐文章:Python Yolov5火焰烟雾识别源码分享-CSDN博客
Python OpenCV识别行人入口进出人数统计_python识别人数-CSDN博客
个人博客主页:alicema1111的博客_CSDN博客-Python,C++,网页领域博主
博主所有文章点这里:alicema1111的博客_CSDN博客-Python,C++,网页领域博主