Subversion Repositories seema-scanner

Rev

Rev 43 | Rev 45 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 43 Rev 44
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 == ""){