Line 2... |
Line 2... |
2 |
#include "ui_SMScanner.h"
|
2 |
#include "ui_SMScanner.h"
|
3 |
|
3 |
|
4 |
#include <QMetaObject>
|
4 |
#include <QMetaObject>
|
5 |
#include <QFileDialog>
|
5 |
#include <QFileDialog>
|
6 |
|
6 |
|
- |
|
7 |
#include <pcl/io/pcd_io.h>
|
- |
|
8 |
#include <pcl/io/ascii_io.h>
|
- |
|
9 |
#include <pcl/io/ply_io.h>
|
- |
|
10 |
#include <pcl/io/png_io.h>
|
- |
|
11 |
#include <pcl/io/vtk_io.h>
|
- |
|
12 |
#include <vtkPolyDataWriter.h>
|
- |
|
13 |
#include <pcl/conversions.h>
|
- |
|
14 |
|
7 |
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner),
|
15 |
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner),
|
8 |
calibrationReviewMode(false), captureReviewMode(false){
|
16 |
calibrationReviewMode(false), captureReviewMode(false){
|
9 |
|
17 |
|
10 |
// Register metatypes
|
18 |
// Register metatypes
|
11 |
qRegisterMetaType<cv::Mat>("cv::Mat");
|
19 |
qRegisterMetaType<cv::Mat>("cv::Mat");
|
Line 15... |
Line 23... |
15 |
qRegisterMetaType<SMCalibrationParameters>("SMCalibrationParameters");
|
23 |
qRegisterMetaType<SMCalibrationParameters>("SMCalibrationParameters");
|
16 |
qRegisterMetaTypeStreamOperators<SMCalibrationParameters>("SMCalibrationParameters");
|
24 |
qRegisterMetaTypeStreamOperators<SMCalibrationParameters>("SMCalibrationParameters");
|
17 |
qRegisterMetaType< std::vector<SMCalibrationSet> >("std::vector<SMCalibrationSet>");
|
25 |
qRegisterMetaType< std::vector<SMCalibrationSet> >("std::vector<SMCalibrationSet>");
|
18 |
qRegisterMetaType<SMFrameSequence>("SMFrameSequence");
|
26 |
qRegisterMetaType<SMFrameSequence>("SMFrameSequence");
|
19 |
qRegisterMetaType< std::vector<SMFrameSequence> >("std::vector<SMFrameSequence>");
|
27 |
qRegisterMetaType< std::vector<SMFrameSequence> >("std::vector<SMFrameSequence>");
|
20 |
qRegisterMetaType<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>("pcl::PointCloud<pcl::PointXYZRGB>::Ptr");
|
28 |
qRegisterMetaType<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr>("pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr");
|
21 |
qRegisterMetaType<SMPointCloud>("SMPointCloud");
|
29 |
qRegisterMetaType<SMPointCloud>("SMPointCloud");
|
22 |
|
30 |
|
23 |
// Setup ui (requires stream operators registered)
|
31 |
// Setup ui (requires stream operators registered)
|
24 |
ui->setupUi(this);
|
32 |
ui->setupUi(this);
|
25 |
|
33 |
|
Line 428... |
Line 436... |
428 |
int id = pointCloudData.size()-1;
|
436 |
int id = pointCloudData.size()-1;
|
429 |
|
437 |
|
430 |
// Add identifier to list
|
438 |
// Add identifier to list
|
431 |
QListWidgetItem* item = new QListWidgetItem(QString("Point Cloud %1 -- %2 deg").arg(id).arg(smCloud.rotationAngle), ui->pointCloudsListWidget);
|
439 |
QListWidgetItem* item = new QListWidgetItem(QString("Point Cloud %1 -- %2 deg").arg(id).arg(smCloud.rotationAngle), ui->pointCloudsListWidget);
|
432 |
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
440 |
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
- |
|
441 |
item->setData(Qt::UserRole, QVariant(id));
|
433 |
item->setCheckState(Qt::Checked);
|
442 |
item->setCheckState(Qt::Checked);
|
- |
|
443 |
|
434 |
ui->pointCloudsListWidget->addItem(item);
|
444 |
ui->pointCloudsListWidget->addItem(item);
|
435 |
|
445 |
|
436 |
ui->pointCloudWidget->addPointCloud(smCloud.pointCloud, id);
|
446 |
ui->pointCloudWidget->addPointCloud(smCloud, id);
|
- |
|
447 |
}
|
- |
|
448 |
|
- |
|
449 |
|
- |
|
450 |
|
- |
|
451 |
void SMScanner::on_actionExport_Point_Clouds_triggered(){
|
- |
|
452 |
|
- |
|
453 |
QString directory = QFileDialog::getExistingDirectory(this, "Export Point Clouds", QString());
|
- |
|
454 |
|
- |
|
455 |
// // Non native file dialog
|
- |
|
456 |
// QFileDialog saveDirectoryDialog(this, "Export Point Clouds", QString(), "*.pcd;;*.ply;;*.vtk;;*.png;;*.txt");
|
- |
|
457 |
// saveDirectoryDialog.setDefaultSuffix("ply");
|
- |
|
458 |
// saveDirectoryDialog.setFileMode(QFileDialog::Directory);
|
- |
|
459 |
// saveDirectoryDialog.exec();
|
- |
|
460 |
// QString directory = saveDirectoryDialog.directory().path();
|
- |
|
461 |
// QString type = saveDirectoryDialog.selectedNameFilter();
|
- |
|
462 |
|
- |
|
463 |
// save point clouds in ply format
|
- |
|
464 |
for(int i=0; i<pointCloudData.size(); i++){
|
- |
|
465 |
QString fileName = QString("%1/pointcloud_%2.ply").arg(directory).arg(i);
|
- |
|
466 |
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr pointCloudPCL(pointCloudData[i].pointCloud);
|
- |
|
467 |
//pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
|
- |
|
468 |
pcl::PLYWriter w;
|
- |
|
469 |
// Write to ply in binary without camera
|
- |
|
470 |
w.write<pcl::PointXYZRGBNormal> (fileName.toStdString(), *pointCloudPCL, true, false);
|
- |
|
471 |
}
|
- |
|
472 |
|
- |
|
473 |
// save meshlab aln project file
|
- |
|
474 |
std::ofstream s(QString("%1/alignment.aln").arg(directory).toLocal8Bit());
|
- |
|
475 |
s << pointCloudData.size() << std::endl;
|
- |
|
476 |
for(int i=0; i<pointCloudData.size(); i++){
|
- |
|
477 |
QString fileName = QString("pointcloud_%1.ply").arg(i);
|
- |
|
478 |
s << fileName.toStdString() << std::endl << "#" << std::endl;
|
- |
|
479 |
cv::Mat Tr = cv::Mat::eye(4, 4, CV_32F);
|
- |
|
480 |
cv::Mat(pointCloudData[i].R.t()).copyTo(Tr.colRange(0, 3).rowRange(0, 3));
|
- |
|
481 |
cv::Mat(-pointCloudData[i].R.t()*pointCloudData[i].T).copyTo(Tr.col(3).rowRange(0, 3));
|
- |
|
482 |
for(int j=0; j<Tr.rows; j++){
|
- |
|
483 |
for(int k=0; k<Tr.cols; k++){
|
- |
|
484 |
s << Tr.at<float>(j,k) << " ";
|
- |
|
485 |
}
|
- |
|
486 |
s << std::endl;
|
- |
|
487 |
}
|
- |
|
488 |
}
|
- |
|
489 |
s << "0" << std::flush;
|
- |
|
490 |
s.close();
|
- |
|
491 |
}
|
- |
|
492 |
|
- |
|
493 |
void SMScanner::on_pointCloudsListWidget_itemChanged(QListWidgetItem *item){
|
- |
|
494 |
|
- |
|
495 |
int id = item->data(Qt::UserRole).toInt();
|
- |
|
496 |
|
- |
|
497 |
if(item->checkState() == Qt::Checked)
|
- |
|
498 |
ui->pointCloudWidget->addPointCloud(pointCloudData[id], id);
|
- |
|
499 |
else
|
- |
|
500 |
ui->pointCloudWidget->removePointCloud(id);
|
- |
|
501 |
|
437 |
}
|
502 |
}
|
438 |
|
503 |
|
439 |
void SMScanner::on_actionExport_Calibration_triggered(){
|
504 |
void SMScanner::on_actionExport_Parameters_triggered(){
|
440 |
|
505 |
|
441 |
QString fileName = QFileDialog::getSaveFileName(this, "Export calibration parameters", QString(), "*.xml");
|
506 |
QString fileName = QFileDialog::getSaveFileName(this, "Export calibration parameters", QString(), "*.xml");
|
442 |
QFileInfo info(fileName);
|
507 |
QFileInfo info(fileName);
|
443 |
QString type = info.suffix();
|
508 |
QString type = info.suffix();
|
444 |
if(type == ""){
|
509 |
if(type == ""){
|