Subversion Repositories seema-scanner

Rev

Rev 142 | Rev 144 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 142 Rev 143
Line 406... Line 406...
406
 
406
 
407
}
407
}
408
 
408
 
409
void SMScanner::on_actionExport_Sets_triggered(){
409
void SMScanner::on_actionExport_Sets_triggered(){
410
 
410
 
411
    cv::Mat frameBGR;
-
 
412
    QString dirName = QFileDialog::getExistingDirectory(this, "Export calibration sets", QString());
411
    QString dirName = QFileDialog::getExistingDirectory(this, "Export calibration sets", QString());
-
 
412
 
-
 
413
    QProgressDialog progressDialog("Exporting Sets...", "Cancel", 0, 100, this);
-
 
414
    progressDialog.setWindowModality(Qt::WindowModal);
-
 
415
    progressDialog.setMinimumDuration(1000);
-
 
416
 
-
 
417
    progressDialog.show();
-
 
418
    cv::Mat frameBGR;
413
    for(unsigned int i=0; i<calibrationData.size(); i++){
419
    for(unsigned int i=0; i<calibrationData.size(); i++){
414
        QString fileName = QString("%1/frame0_%2.png").arg(dirName).arg(i);
420
        QString fileName = QString("%1/frame0_%2.png").arg(dirName).arg(i);
415
 
421
 
-
 
422
        progressDialog.setValue(100.0*i/calibrationData.size());
-
 
423
 
416
        // Convert to BGR
424
        // Convert to BGR
417
        if(calibrationData[i].frame0.channels() == 1)
425
        if(calibrationData[i].frame0.channels() == 1)
418
            cv::cvtColor(calibrationData[i].frame0, frameBGR, CV_BayerBG2BGR);
426
            cv::cvtColor(calibrationData[i].frame0, frameBGR, CV_BayerBG2BGR);
419
        else
427
        else
420
            cv::cvtColor(calibrationData[i].frame1, frameBGR, CV_RGB2BGR);
428
            cv::cvtColor(calibrationData[i].frame1, frameBGR, CV_RGB2BGR);
Line 430... Line 438...
430
 
438
 
431
        cv::imwrite(fileName.toStdString(), frameBGR);
439
        cv::imwrite(fileName.toStdString(), frameBGR);
432
 
440
 
433
        // Necessary to prevent pileup of video frame signals
441
        // Necessary to prevent pileup of video frame signals
434
        QCoreApplication::processEvents();
442
        QCoreApplication::processEvents();
-
 
443
 
-
 
444
        if(progressDialog.wasCanceled())
-
 
445
            return;
435
    }
446
    }
436
 
447
 
437
}
448
}
438
 
449
 
439
void SMScanner::on_actionExport_Sequences_triggered(){
450
void SMScanner::on_actionExport_Sequences_triggered(){
440
 
451
 
-
 
452
    QString dirName = QFileDialog::getExistingDirectory(this, "Export frame sequences", QString());
-
 
453
 
441
    QProgressDialog progressDialog("Exporting Sequences.", "Cancel", 0, 100, this);
454
    QProgressDialog progressDialog("Exporting Sequences...", "Cancel", 0, 100, this);
442
    progressDialog.setWindowModality(Qt::WindowModal);
455
    progressDialog.setWindowModality(Qt::WindowModal);
443
    progressDialog.setMinimumDuration(1000);
456
    progressDialog.setMinimumDuration(1000);
444
 
457
 
445
    progressDialog.show();
458
    progressDialog.show();
446
 
459
 
447
    cv::Mat frameBGR;
460
    cv::Mat frameBGR;
448
    QString dirName = QFileDialog::getExistingDirectory(this, "Export frame sequences", QString());
-
 
449
    for(unsigned int i=0; i<captureData.size(); i++){
461
    for(unsigned int i=0; i<captureData.size(); i++){
450
 
462
 
451
        QString seqDirName = QString("%1/sequence_%2").arg(dirName).arg(i);
463
        QString seqDirName = QString("%1/sequence_%2").arg(dirName).arg(i);
452
        if(!QDir().mkdir(seqDirName))
464
        if(!QDir().mkdir(seqDirName))
453
            std::cerr << "Could not create directory " << seqDirName.toStdString() << std::endl;
465
            std::cerr << "Could not create directory " << seqDirName.toStdString() << std::endl;
454
        for(unsigned int j=0; j<captureData[i].frames0.size(); j++){
466
        for(unsigned int j=0; j<captureData[i].frames0.size(); j++){
455
 
467
 
456
            progressDialog.setValue(100.0*i/captureData.size() + 100.0*i/captureData.size()*j/captureData[i].frames0.size());
468
            progressDialog.setValue(100.0*i/captureData.size() + 100.0/captureData.size()*j/captureData[i].frames0.size());
457
            progressDialog.update();
-
 
458
 
469
 
459
            QString fileName0 = QString("%1/frames0_%2.png").arg(seqDirName).arg(j);
470
            QString fileName0 = QString("%1/frames0_%2.png").arg(seqDirName).arg(j);
460
            // Convert Bayer to rgb (png needs BGR order)
471
            // Convert Bayer to rgb (png needs BGR order)
461
            cv::cvtColor(captureData[i].frames0[j], frameBGR, CV_BayerBG2BGR);
472
            cv::cvtColor(captureData[i].frames0[j], frameBGR, CV_BayerBG2BGR);
462
            cv::imwrite(fileName0.toStdString(), frameBGR);
473
            cv::imwrite(fileName0.toStdString(), frameBGR);
Line 477... Line 488...
477
    }
488
    }
478
}
489
}
479
 
490
 
480
void SMScanner::on_actionExport_White_Frames_triggered(){
491
void SMScanner::on_actionExport_White_Frames_triggered(){
481
 
492
 
482
    cv::Mat frameBGR;
-
 
483
    QString dirName = QFileDialog::getExistingDirectory(this, "Export frame sequences", QString());
493
    QString dirName = QFileDialog::getExistingDirectory(this, "Export frame sequences", QString());
-
 
494
 
-
 
495
    QProgressDialog progressDialog("Exporting White Frames...", "Cancel", 0, 100, this);
-
 
496
    progressDialog.setWindowModality(Qt::WindowModal);
-
 
497
    progressDialog.setMinimumDuration(1000);
-
 
498
 
-
 
499
    cv::Mat frameBGR;
484
    for(unsigned int i=0; i<captureData.size(); i++){
500
    for(unsigned int i=0; i<captureData.size(); i++){
-
 
501
 
-
 
502
        progressDialog.setValue(100.0*i/captureData.size());
-
 
503
 
485
        QString seqDirName = QString("%1/sequence_%2").arg(dirName).arg(i);
504
        QString seqDirName = QString("%1/sequence_%2").arg(dirName).arg(i);
486
        if(!QDir().mkdir(seqDirName))
505
        if(!QDir().mkdir(seqDirName))
487
            std::cerr << "Could not create directory " << seqDirName.toStdString() << std::endl;
506
            std::cerr << "Could not create directory " << seqDirName.toStdString() << std::endl;
488
 
507
 
489
        QString fileName = QString("%1/frames0_0.png").arg(seqDirName);
508
        QString fileName = QString("%1/frames0_0.png").arg(seqDirName);
Line 497... Line 516...
497
        // Convert Bayer to rgb (png needs BGR order)
516
        // Convert Bayer to rgb (png needs BGR order)
498
        cv::cvtColor(captureData[i].frames1[0], frameBGR, CV_BayerBG2BGR);
517
        cv::cvtColor(captureData[i].frames1[0], frameBGR, CV_BayerBG2BGR);
499
        cv::imwrite(fileName.toStdString(), frameBGR);
518
        cv::imwrite(fileName.toStdString(), frameBGR);
500
        // Necessary to prevent memory pileup
519
        // Necessary to prevent memory pileup
501
        QCoreApplication::processEvents();
520
        QCoreApplication::processEvents();
502
 
-
 
-
 
521
        if(progressDialog.wasCanceled())
-
 
522
            return;
503
    }
523
    }
504
 
524
 
505
}
525
}
506
 
526
 
507
void SMScanner::on_reconstructButton_clicked(){
527
void SMScanner::on_reconstructButton_clicked(){
Line 564... Line 584...
564
//    saveDirectoryDialog.setFileMode(QFileDialog::Directory);
584
//    saveDirectoryDialog.setFileMode(QFileDialog::Directory);
565
//    saveDirectoryDialog.exec();
585
//    saveDirectoryDialog.exec();
566
//    QString directory = saveDirectoryDialog.directory().path();
586
//    QString directory = saveDirectoryDialog.directory().path();
567
//    QString type = saveDirectoryDialog.selectedNameFilter();
587
//    QString type = saveDirectoryDialog.selectedNameFilter();
568
 
588
 
-
 
589
    QProgressDialog progressDialog("Exporting White Frames...", "Cancel", 0, 100, this);
-
 
590
    progressDialog.setWindowModality(Qt::WindowModal);
-
 
591
    progressDialog.setMinimumDuration(1000);
-
 
592
 
569
    // save point clouds in ply format
593
    // save point clouds in ply format
570
    for(unsigned int i=0; i<pointCloudData.size(); i++){
594
    for(unsigned int i=0; i<pointCloudData.size(); i++){
-
 
595
 
-
 
596
        progressDialog.setValue(100.0*i/pointCloudData.size());
-
 
597
 
571
        QString fileName = QString("%1/pointcloud_%2.ply").arg(directory).arg(i);
598
        QString fileName = QString("%1/pointcloud_%2.ply").arg(directory).arg(i);
572
        pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr pointCloudPCL(pointCloudData[i].pointCloud);
599
        pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr pointCloudPCL(pointCloudData[i].pointCloud);
573
        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
600
        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
574
        pcl::PLYWriter w;
601
        pcl::PLYWriter w;
575
        // Write to ply in binary without camera
602
        // Write to ply in binary without camera
576
        w.write<pcl::PointXYZRGBNormal> (fileName.toStdString(), *pointCloudPCL, true, false);
603
        w.write<pcl::PointXYZRGBNormal> (fileName.toStdString(), *pointCloudPCL, true, false);
-
 
604
 
-
 
605
        QCoreApplication::processEvents();
-
 
606
        if(progressDialog.wasCanceled())
-
 
607
            return;
577
    }
608
    }
578
 
609
 
579
    // save meshlab aln project file
610
    // save meshlab aln project file
580
    std::ofstream s(QString("%1/alignment.aln").arg(directory).toLocal8Bit());
611
    std::ofstream s(QString("%1/alignment.aln").arg(directory).toLocal8Bit());
581
    s << pointCloudData.size() << std::endl;
612
    s << pointCloudData.size() << std::endl;
Line 665... Line 696...
665
    }
696
    }
666
 
697
 
667
    calibrationData.clear();
698
    calibrationData.clear();
668
    ui->calibrationListWidget->clear();
699
    ui->calibrationListWidget->clear();
669
 
700
 
-
 
701
    QProgressDialog progressDialog("Importing Sets...", "Cancel", 0, 100, this);
-
 
702
    progressDialog.setWindowModality(Qt::WindowModal);
670
    int nSets = fileNames0.size();
703
    progressDialog.setMinimumDuration(1000);
671
 
704
 
-
 
705
    int nSets = fileNames0.size();
672
    for(unsigned int i=0; i<nSets; i++){
706
    for(unsigned int i=0; i<nSets; i++){
673
 
707
 
-
 
708
        progressDialog.setValue(100.0*i/nSets);
-
 
709
 
674
        SMCalibrationSet calibrationSet;
710
        SMCalibrationSet calibrationSet;
675
 
711
 
676
        QString fileName0 = QString("%1/frame0_%2.png").arg(dirName).arg(i);
712
        QString fileName0 = QString("%1/frame0_%2.png").arg(dirName).arg(i);
677
        cv::Mat frame0BGR = cv::imread(fileName0.toStdString());
713
        cv::Mat frame0BGR = cv::imread(fileName0.toStdString());
678
        cvtools::cvtColorBGRToBayerBG(frame0BGR, calibrationSet.frame0);
714
        cvtools::cvtColorBGRToBayerBG(frame0BGR, calibrationSet.frame0);
Line 692... Line 728...
692
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
728
        item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
693
        item->setCheckState(Qt::Unchecked);
729
        item->setCheckState(Qt::Unchecked);
694
        ui->calibrationListWidget->addItem(item);
730
        ui->calibrationListWidget->addItem(item);
695
 
731
 
696
        QCoreApplication::processEvents();
732
        QCoreApplication::processEvents();
-
 
733
        if(progressDialog.wasCanceled())
-
 
734
            return;
697
    }
735
    }
698
 
736
 
699
    // Set enabled checkmark
737
    // Set enabled checkmark
700
    if(calibrationData.size() >= 2)
738
    if(calibrationData.size() >= 2)
701
        ui->calibrateButton->setEnabled(true);
739
        ui->calibrateButton->setEnabled(true);
702
}
740
}
703
 
741
 
704
void SMScanner::on_actionImport_Sequences_triggered(){
742
void SMScanner::on_actionImport_Sequences_triggered(){
705
 
743
 
706
    // NOTE: we do not know which algorithm was used!!!
744
    // NOTE: we do not know which algorithm was used!!!
-
 
745
 
707
    QString dirName = QFileDialog::getExistingDirectory(this, "Import captured sequences", QString());
746
    QString dirName = QFileDialog::getExistingDirectory(this, "Import captured sequences", QString());
708
 
747
 
709
    QDir dir(dirName);
748
    QDir dir(dirName);
710
    QStringList sequenceDirNames = dir.entryList(QStringList("sequence_*"));
749
    QStringList sequenceDirNames = dir.entryList(QStringList("sequence_*"));
711
 
750
 
Line 715... Line 754...
715
    }
754
    }
716
 
755
 
717
    captureData.clear();
756
    captureData.clear();
718
    ui->captureTreeWidget->clear();
757
    ui->captureTreeWidget->clear();
719
 
758
 
-
 
759
    QProgressDialog progressDialog("Importing Sequences...", "Cancel", 0, 100, this);
-
 
760
    progressDialog.setWindowModality(Qt::WindowModal);
-
 
761
    progressDialog.setMinimumDuration(1000);
-
 
762
 
720
    for(int s=0; s<sequenceDirNames.count(); s++){
763
    for(int s=0; s<sequenceDirNames.count(); s++){
721
 
764
 
722
        QDir sequenceDir(QString("%1/%2").arg(dirName).arg(sequenceDirNames.at(s)));
765
        QDir sequenceDir(QString("%1/%2").arg(dirName).arg(sequenceDirNames.at(s)));
723
 
766
 
724
        QStringList fileNames0 = sequenceDir.entryList(QStringList("frames0_*.png"));
767
        QStringList fileNames0 = sequenceDir.entryList(QStringList("frames0_*.png"));
Line 733... Line 776...
733
 
776
 
734
        SMFrameSequence sequence;
777
        SMFrameSequence sequence;
735
 
778
 
736
        for(int f=0; f<nFrames; f++){
779
        for(int f=0; f<nFrames; f++){
737
 
780
 
-
 
781
            progressDialog.setValue(100.0*s/sequenceDirNames.count() + 100.0/sequenceDirNames.count()*f/nFrames);
-
 
782
 
738
            cv::Mat frame0BGR, frame0BayerBG, frame1BGR, frame1BayerBG;
783
            cv::Mat frame0BGR, frame0BayerBG, frame1BGR, frame1BayerBG;
739
 
784
 
740
            QString fileName0 = QString("%1/%2/frames0_%3.png").arg(dirName).arg(sequenceDirNames.at(s)).arg(f);
785
            QString fileName0 = QString("%1/%2/frames0_%3.png").arg(dirName).arg(sequenceDirNames.at(s)).arg(f);
741
            frame0BGR = cv::imread(fileName0.toStdString());
786
            frame0BGR = cv::imread(fileName0.toStdString());
742
            cvtools::cvtColorBGRToBayerBG(frame0BGR, frame0BayerBG);
787
            cvtools::cvtColorBGRToBayerBG(frame0BGR, frame0BayerBG);
Line 747... Line 792...
747
 
792
 
748
            sequence.frames0.push_back(frame0BayerBG);
793
            sequence.frames0.push_back(frame0BayerBG);
749
            sequence.frames1.push_back(frame1BayerBG);
794
            sequence.frames1.push_back(frame1BayerBG);
750
 
795
 
751
            QCoreApplication::processEvents();
796
            QCoreApplication::processEvents();
-
 
797
            if(progressDialog.wasCanceled())
-
 
798
                return;
752
        }
799
        }
-
 
800
 
-
 
801
        // Assign whatever algorithm is configured
753
        sequence.codec = settings.value("algorithm").toString();
802
        sequence.codec = settings.value("algorithm").toString();
754
        sequence.rotationAngle = 0;
803
        sequence.rotationAngle = 0;
755
        sequence.reconstructed = false;
804
        sequence.reconstructed = false;
756
 
805
 
757
        onReceiveFrameSequence(sequence);
806
        onReceiveFrameSequence(sequence);