Subversion Repositories seema-scanner

Rev

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

Rev 137 Rev 139
Line 11... Line 11...
11
#include <pcl/io/png_io.h>
11
#include <pcl/io/png_io.h>
12
#include <pcl/io/vtk_io.h>
12
#include <pcl/io/vtk_io.h>
13
#include <vtkPolyDataWriter.h>
13
#include <vtkPolyDataWriter.h>
14
#include <pcl/conversions.h>
14
#include <pcl/conversions.h>
15
 
15
 
-
 
16
#include "cvtools.h"
-
 
17
 
16
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner),
18
SMScanner::SMScanner(QWidget *parent) :QMainWindow(parent), ui(new Ui::SMScanner),
17
                                        calibrationReviewMode(false), captureReviewMode(false), lastCaptureId(-1){
19
                                        calibrationReviewMode(false), captureReviewMode(false), lastCaptureId(-1){
18
 
20
 
19
    // Register metatypes
21
    // Register metatypes
20
    qRegisterMetaType<cv::Mat>("cv::Mat");
22
    qRegisterMetaType<cv::Mat>("cv::Mat");
Line 355... Line 357...
355
    captureData.push_back(frameSequence);
357
    captureData.push_back(frameSequence);
356
 
358
 
357
    // Add identifier to list
359
    // Add identifier to list
358
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->captureTreeWidget);
360
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->captureTreeWidget);
359
    item->setText(0, QString("Frame Sequence %1 -- %2 deg").arg(id).arg(frameSequence.rotationAngle));
361
    item->setText(0, QString("Frame Sequence %1 -- %2 deg").arg(id).arg(frameSequence.rotationAngle));
360
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
362
    //item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
361
    item->setData(0, Qt::UserRole, QPoint(captureData.size()-1, -1));
363
    item->setData(0, Qt::UserRole, QPoint(captureData.size()-1, -1));
362
    item->setCheckState(0, Qt::Checked);
364
    //item->setCheckState(0, Qt::Checked);
363
    //ui->captureTreeWidget->addItem(item);
365
    //ui->captureTreeWidget->addItem(item);
364
 
366
 
365
    for(unsigned int i=0; i<frameSequence.frames0.size(); i++){
367
    for(unsigned int i=0; i<frameSequence.frames0.size(); i++){
366
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
368
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
367
        subItem->setText(0, QString("frames %1").arg(i));
369
        subItem->setText(0, QString("frames %1").arg(i));
Line 505... Line 507...
505
 
507
 
506
    // Start reconstructing
508
    // Start reconstructing
507
    QMetaObject::invokeMethod(reconstructionWorker, "setup");
509
    QMetaObject::invokeMethod(reconstructionWorker, "setup");
508
 
510
 
509
    for(unsigned int i=0; i<captureData.size(); i++){
511
    for(unsigned int i=0; i<captureData.size(); i++){
510
        if(!captureData[i].reconstructed & (ui->captureTreeWidget->topLevelItem(i)->checkState(0) == Qt::Checked))
512
        if(!captureData[i].reconstructed){ // & (ui->captureTreeWidget->topLevelItem(i)->checkState(0) == Qt::Checked))
-
 
513
            captureData[i].reconstructed = true;
511
            QMetaObject::invokeMethod(reconstructionWorker, "reconstructPointCloud", Q_ARG(SMFrameSequence, captureData[i]));
514
            QMetaObject::invokeMethod(reconstructionWorker, "reconstructPointCloud", Q_ARG(SMFrameSequence, captureData[i]));
-
 
515
        }
512
    }
516
    }
513
 
517
 
514
}
518
}
515
 
519
 
516
void SMScanner::onNewPointCloud(SMPointCloud smCloud){
520
void SMScanner::onNewPointCloud(SMPointCloud smCloud){
517
 
521
 
518
    int id = smCloud.id;
522
    int id = smCloud.id;
519
 
523
 
520
    for(int i=0; i<captureData.size(); i++){
524
//    for(int i=0; i<captureData.size(); i++){
521
        if(captureData[i].id == id)
525
//        if(captureData[i].id == id)
522
            captureData[i].reconstructed = true;
526
//            captureData[i].reconstructed = true;
523
    }
527
//    }
524
 
528
 
525
    pointCloudData.push_back(smCloud);
529
    pointCloudData.push_back(smCloud);
526
 
530
 
527
    // Add identifier to list
531
    // Add identifier to list
528
    QListWidgetItem* item = new QListWidgetItem(QString("Point Cloud %1 -- %2 deg").arg(id).arg(smCloud.rotationAngle), ui->pointCloudsListWidget);
532
    QListWidgetItem* item = new QListWidgetItem(QString("Point Cloud %1 -- %2 deg").arg(id).arg(smCloud.rotationAngle), ui->pointCloudsListWidget);
Line 628... Line 632...
628
    SMCalibrationParameters cal;
632
    SMCalibrationParameters cal;
629
    cal.importFromXML(fileName);
633
    cal.importFromXML(fileName);
630
 
634
 
631
    settings.setValue("calibration/parameters",  QVariant::fromValue(cal));
635
    settings.setValue("calibration/parameters",  QVariant::fromValue(cal));
632
    ui->pointCloudWidget->updateCalibrationParameters();
636
    ui->pointCloudWidget->updateCalibrationParameters();
-
 
637
 
-
 
638
    std::cout << "Imported calibration parameters " << fileName.toStdString() << std::endl;
633
}
639
}
634
 
640
 
635
void SMScanner::on_actionImport_Sets_triggered(){
641
void SMScanner::on_actionImport_Sets_triggered(){
636
 
642
 
637
    QString dirName = QFileDialog::getExistingDirectory(this, "Import calibration sets", QString());
643
    QString dirName = QFileDialog::getExistingDirectory(this, "Import calibration sets", QString());
Line 652... Line 658...
652
 
658
 
653
    for(unsigned int i=0; i<nSets; i++){
659
    for(unsigned int i=0; i<nSets; i++){
654
 
660
 
655
        SMCalibrationSet calibrationSet;
661
        SMCalibrationSet calibrationSet;
656
 
662
 
657
        QString fileName0 = QString("%1/%2").arg(dirName).arg(fileNames0.at(i));
663
        QString fileName0 = QString("%1/%2/frame0_%3.png").arg(dirName).arg(i);
658
        calibrationSet.frame0 = cv::imread(fileName0.toStdString());
664
        cv::Mat frame0BGR = cv::imread(fileName0.toStdString());
659
        cv::cvtColor(calibrationSet.frame0, calibrationSet.frame0, CV_BGR2RGB);
665
        cvtools::cvtColorBGRToBayerBG(frame0BGR, calibrationSet.frame0);
-
 
666
 
660
        QString fileName1 = QString("%1/%2").arg(dirName).arg(fileNames1.at(i));
667
        QString fileName1 = QString("%1/%2/frame1_%3.png").arg(dirName).arg(i);
661
        calibrationSet.frame1 = cv::imread(fileName1.toStdString());
668
        cv::Mat frame1BGR = cv::imread(fileName1.toStdString());
662
        cv::cvtColor(calibrationSet.frame1, calibrationSet.frame1, CV_BGR2RGB);
669
        cvtools::cvtColorBGRToBayerBG(frame1BGR, calibrationSet.frame1);
-
 
670
 
663
 
671
 
664
        int id = ui->calibrationListWidget->count();
672
        int id = ui->calibrationListWidget->count();
665
        calibrationSet.id = id;
673
        calibrationSet.id = id;
666
 
674
 
667
        calibrationData.push_back(calibrationSet);
675
        calibrationData.push_back(calibrationSet);
Line 677... Line 685...
677
 
685
 
678
    // Set enabled checkmark
686
    // Set enabled checkmark
679
    if(calibrationData.size() >= 2)
687
    if(calibrationData.size() >= 2)
680
        ui->calibrateButton->setEnabled(true);
688
        ui->calibrateButton->setEnabled(true);
681
}
689
}
-
 
690
 
-
 
691
void SMScanner::on_actionImport_Sequences_triggered(){
-
 
692
 
-
 
693
    // NOTE: we do not know which algorithm was used!!!
-
 
694
    QString dirName = QFileDialog::getExistingDirectory(this, "Import captured sequences", QString());
-
 
695
 
-
 
696
    QDir dir(dirName);
-
 
697
    QStringList sequenceDirNames = dir.entryList(QStringList("sequence_*"));
-
 
698
 
-
 
699
    if(sequenceDirNames.empty()){
-
 
700
        std::cerr << "Error: could not find sequences." << std::endl;
-
 
701
        return;
-
 
702
    }
-
 
703
 
-
 
704
    captureData.clear();
-
 
705
    ui->captureTreeWidget->clear();
-
 
706
 
-
 
707
    for(int s=0; s<sequenceDirNames.count(); s++){
-
 
708
 
-
 
709
        QDir sequenceDir(QString("%1/%2").arg(dirName).arg(sequenceDirNames.at(s)));
-
 
710
 
-
 
711
        QStringList fileNames0 = sequenceDir.entryList(QStringList("frames0_*.png"));
-
 
712
        QStringList fileNames1 = sequenceDir.entryList(QStringList("frames1_*.png"));
-
 
713
 
-
 
714
        if(fileNames0.empty() || fileNames1.empty() || fileNames0.count() != fileNames1.count()){
-
 
715
            std::cerr << "Error: could not load sequence. Directory must contain .png files for both cameras." << std::endl;
-
 
716
            return;
-
 
717
        }
-
 
718
 
-
 
719
        int nFrames = fileNames0.size();
-
 
720
 
-
 
721
        SMFrameSequence sequence;
-
 
722
 
-
 
723
        for(int f=0; f<nFrames; f++){
-
 
724
 
-
 
725
            cv::Mat frame0BGR, frame0BayerBG, frame1BGR, frame1BayerBG;
-
 
726
 
-
 
727
            QString fileName0 = QString("%1/%2/frames0_%3.png").arg(dirName).arg(sequenceDirNames.at(s)).arg(f);
-
 
728
            frame0BGR = cv::imread(fileName0.toStdString());
-
 
729
            cvtools::cvtColorBGRToBayerBG(frame0BGR, frame0BayerBG);
-
 
730
 
-
 
731
            QString fileName1 = QString("%1/%2/frames1_%3.png").arg(dirName).arg(sequenceDirNames.at(s)).arg(f);
-
 
732
            frame1BGR = cv::imread(fileName1.toStdString());
-
 
733
            cvtools::cvtColorBGRToBayerBG(frame1BGR, frame1BayerBG);
-
 
734
 
-
 
735
            sequence.frames0.push_back(frame0BayerBG);
-
 
736
            sequence.frames1.push_back(frame1BayerBG);
-
 
737
 
-
 
738
            QCoreApplication::processEvents();
-
 
739
        }
-
 
740
        sequence.codec = settings.value("algorithm").toString();
-
 
741
        sequence.rotationAngle = 0;
-
 
742
        sequence.reconstructed = false;
-
 
743
 
-
 
744
        onReceiveFrameSequence(sequence);
-
 
745
    }
-
 
746
 
-
 
747
}
-
 
748
 
-
 
749
void SMScanner::on_actionClear_Point_Clouds_triggered(){
-
 
750
 
-
 
751
    int res = QMessageBox::question(this, "Clear Reconstructed Point Clouds", "Clear all reconstructed point clouds?", QMessageBox::Ok, QMessageBox::Cancel);
-
 
752
 
-
 
753
    if(res == QMessageBox::Ok){
-
 
754
 
-
 
755
        pointCloudData.clear();
-
 
756
        ui->pointCloudsListWidget->clear();
-
 
757
        ui->pointCloudWidget->removeAllPointClouds();
-
 
758
 
-
 
759
        for(int i=0; i<captureData.size(); i++)
-
 
760
            captureData[i].reconstructed = false;
-
 
761
    }
-
 
762
}