#include "mainwindow.h"
#include "ui_mainwindow.h"
//创建菜单栏,工具栏,状态栏应当包含的头文件
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <QStatusBar>
#include <QAbstractAnimation>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_publicIconMap[TREE_ITEM_ICON_DataItem] = QIcon(QStringLiteral("Icons/folder.png"));
model = new QStandardItemModel(ui->treeView);
model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("--cloud--DB-Tree--"));
ui->treeView->setHeaderHidden(true);
ui->treeView->setModel(model);
ui->treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);//设置多选
/**************************************初始化******************************************/
//初始化PCL显示控件
viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
viewer->setBackgroundColor(0.56,0.6,0.623);
ui->qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
viewer->setupInteractor(ui->qvtkWidget->GetInteractor(), ui->qvtkWidget->GetRenderWindow());
ui->qvtkWidget->update();
/**************************************创建菜单******************************************/
QMenuBar *menu_bar = new QMenuBar(this); //创建一个菜单栏
this->setMenuBar(menu_bar); //设置为MainWindow的菜单栏
menu_bar->setStyleSheet("font-size : 18px");
QMenu *file_menu = new QMenu("文件",menu_bar);
QMenu *visualization_menu=new QMenu("显示",menu_bar);
QMenu *filter_menu=new QMenu("滤波",menu_bar);
QMenu *registration_menu=new QMenu("配准",menu_bar);
//**************************************菜单中创建动作******************************************//
//文件下拉框
QAction *open_action = new QAction("读取");
QAction *save_action = new QAction("保存");
QAction *quit_action = new QAction("退出");
file_menu->addAction(open_action);//添加动作到文件菜单,QAction就会自动变成子菜单
file_menu->addAction(save_action);
file_menu->addSeparator(); //添加菜单分隔符
file_menu->addAction(quit_action);
//滤波
QAction *voxel_action=new QAction("体素滤波");
filter_menu->addAction(voxel_action);
//配准
QAction *icp_action=new QAction("ICP");
registration_menu->addAction(icp_action);
//***********************************菜单添加至菜单栏***************************************//
menu_bar->addMenu(file_menu);//把菜单添加到菜单栏
menu_bar->addMenu(filter_menu);//滤波按钮
menu_bar->addMenu(registration_menu);//配准按钮
menu_bar->addMenu(visualization_menu);
//***********************************connect设置*******************************************//
//------------------------------------------------------------------
//文件
connect(open_action,SIGNAL(triggered()),this,SLOT(Open_clicked()));//读取文件
connect(save_action,SIGNAL(triggered()),this,SLOT(Save_clicked()));//保存文件
connect(quit_action,SIGNAL(triggered()),this,SLOT(close()));
//------------------------------------------------------------------
//filter
connect(voxel_action,SIGNAL(triggered()),this,SLOT(pressBtn_voxel()));
//------------------------------------------------------------------
//registration
connect(icp_action,SIGNAL(triggered()),this,SLOT(pressBtn_icp()));
//visualization
}
MainWindow::~MainWindow()
{
delete ui;
}
//-------------------------------------function----------------------------------------------------//
//读取有逗号的xyz
pcl::PointCloud<pcl::PointXYZ>::Ptr get_pointcloud_from_txt(const std::string& file_path)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
std::ifstream file(file_path.c_str());//c_str():生成一个const char*指针,指向以空字符终止的数组。
while (file)
{
std::string s;
if (!getline(file, s)) break;
std::istringstream ss(s);
std::vector <std::string> record;
std::vector <float> point;
pcl::PointXYZ p;
while (ss)
{
std::string s;
if (!getline(ss, s, ',')) break;
point.push_back(atof(s.c_str()));
}
p.x = point[0];
p.y = point[1];
p.z = point[2];
//p.intensity = point[3];
cloud->push_back(p);
}
file.close();
return cloud;
}
//-------------------------------------file-----------------------------------------------------
//读取点云
void MainWindow::Open_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("open file"),
"", tr("pcb files(*.pcd *.ply *.xyz) ;;All files (*.*)"));
if(fileName.isEmpty())
{
return;
}
if(fileName.endsWith("ply"))
{
qDebug()<<fileName;
if (pcl::io::loadPLYFile<pcl::PointXYZ>(fileName.toStdString(), cloud) == -1) //* load the file
{
qDebug()<<"Couldn't read file \n";
return ;
}
}
else if (fileName.endsWith("pcd"))
{
qDebug()<<fileName;
if (pcl::io::loadPCDFile<pcl::PointXYZ>(fileName.toStdString(), cloud) == -1) //* load the file
{
qDebug()<<"Couldn't read pcd file \n";
return ;
}
}
else if (fileName.endsWith("xyz"))
{
QFuture<pcl::PointCloud<pcl::PointXYZ>::Ptr> future =
QtConcurrent::run(get_pointcloud_from_txt,std::string(fileName.toStdString()));
while(!future.isFinished())
{
QApplication::processEvents(QEventLoop::AllEvents, 100);
}
auto cloud_out=future.result();
cloud=*cloud_out;
}
else {
QMessageBox::warning(this, "Warning","点云读取格式错误!");
}
//-----------------------------------------------------
cloud_vec.push_back(cloud.makeShared());
cloud_index.push_back(1);
itemFolder = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_folder")],QStringLiteral("cloud%1").arg(cloud_vec.size()-1));
itemFolder->setCheckable(true);
itemFolder->setCheckState(Qt::Checked);//获取选中状态
model->appendRow(itemFolder);
// item = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_dataItem")],QStringLiteral("%1").arg(cloud_vec.size()-1));
// item->setCheckable(true);
// item->setCheckState(Qt::Checked);//获取选中状态
// itemFolder->appendRow(item);
//-----------------------------------------------------------
int size = static_cast<int>(cloud.size());
QString PointSize = QString("%1").arg(size);
ui->textBrowser_2->clear();
ui->textBrowser_2->insertPlainText("点云数量: "+PointSize);
ui->textBrowser_2->setFont(QFont( "Arial" , 9 ,QFont::Normal ));
//-----------------------------------------------------------------
//移除窗口点云
//点云设置
viewer->addPointCloud(cloud.makeShared(),std::to_string(cloud_vec.size()-1));
//设置点云大小
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, point_size, std::to_string(cloud_vec.size()-1));
viewer->resetCamera();
ui->qvtkWidget->update();
}
void MainWindow::Save_clicked()
{
QString filename = QFileDialog::getSaveFileName(this, tr ("Open point cloud"), "", tr ("Point cloud data (*.pcd *.ply)"));
if(cloud.empty())
{
return;
}
else
{
if (filename.isEmpty ())
return;
int return_status;
- 1
- 2
- 3
- 4
- 5
- 6
前往页