Subversion Repositories seema-scanner

Rev

Rev 251 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 251 Rev 255
Line 39... Line 39...
39
 
39
 
40
    // Restore geometry
40
    // Restore geometry
41
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
41
    this->restoreGeometry(settings.value("geometry/mainwindow").toByteArray());
42
    this->restoreState(settings.value("state/mainwindow").toByteArray());
42
    this->restoreState(settings.value("state/mainwindow").toByteArray());
43
 
43
 
-
 
44
    // Set up export thread
-
 
45
    exportWorker = new SMExportWorker();
-
 
46
    exportWorkerThread = new QThread(this);
-
 
47
    exportWorkerThread->setObjectName("exportWorkerThread");
-
 
48
    exportWorker->moveToThread(exportWorkerThread);
-
 
49
    exportWorkerThread->start();
-
 
50
 
-
 
51
    // Connections
-
 
52
    connect(this, SIGNAL(exportFrameSequence(QString, SMFrameSequence)), exportWorker, SLOT(exportFrameSequence(QString, SMFrameSequence)));
-
 
53
    connect(exportWorker, SIGNAL(progressUpdate(int)), this, SLOT(onExportProgress(int)));
-
 
54
    connect(exportWorker, SIGNAL(aborted()), this, SLOT(onAbortedExport()));
-
 
55
    connect(exportWorker, SIGNAL(finished(int)), this, SLOT(onFinishedExport(int)));
-
 
56
 
-
 
57
    // Start export timer
-
 
58
    exportTimer = new QTimer(this);
-
 
59
    connect(exportTimer, SIGNAL(timeout()), exportWorker, SLOT(work()));
-
 
60
    exportTimer->start(1000);
-
 
61
 
44
    // Set up capture thread
62
    // Set up capture thread
45
    captureWorker = new SMCaptureWorker;
63
    captureWorker = new SMCaptureWorker;
46
    captureWorkerThread = new QThread(this);
64
    captureWorkerThread = new QThread(this);
47
    captureWorkerThread->setObjectName("captureWorkerThread");
65
    captureWorkerThread->setObjectName("captureWorkerThread");
48
    captureWorker->moveToThread(captureWorkerThread);
66
    captureWorker->moveToThread(captureWorkerThread);
Line 195... Line 213...
195
    if(angleStart > angleEnd)
213
    if(angleStart > angleEnd)
196
        angleEnd += 360;
214
        angleEnd += 360;
197
 
215
 
198
    std::vector<float> angles;
216
    std::vector<float> angles;
199
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
217
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
200
        angles.push_back(i % 360);
218
       angles.push_back(i % 360);
201
 
219
 
202
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSets", Q_ARG(std::vector<float>, angles));
220
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSets", Q_ARG(std::vector<float>, angles));
203
 
221
 
204
    std::cout << "Aquiring sets at ";
222
    std::cout << "Aquiring sets at ";
205
    for(unsigned int i=0; i<angles.size(); i++)
223
    for(unsigned int i=0; i<angles.size(); i++)
Line 273... Line 291...
273
        QMetaObject::invokeMethod(calibrationWorker, "cameraCalibration", Q_ARG(std::vector<SMCalibrationSet>, calibrationData));
291
        QMetaObject::invokeMethod(calibrationWorker, "cameraCalibration", Q_ARG(std::vector<SMCalibrationSet>, calibrationData));
274
 
292
 
275
 
293
 
276
}
294
}
277
 
295
 
278
void SMScanner::onReceiveCheckerboardResult(int idx, SMCalibrationSet calibrationSet){
296
void SMScanner::onReceiveCheckerboardResult(int, SMCalibrationSet calibrationSet){
279
 
297
 
280
    int id = ui->calibrationListWidget->count();
298
    int id = ui->calibrationListWidget->count();
281
    calibrationSet.id = id;
299
    calibrationSet.id = id;
282
 
300
 
283
    calibrationData.push_back(calibrationSet);
301
    calibrationData.push_back(calibrationSet);
Line 385... Line 403...
385
        captureReviewMode = false;
403
        captureReviewMode = false;
386
        return;
404
        return;
387
    }
405
    }
388
 
406
 
389
    // Construct vector of angles
407
    // Construct vector of angles
-
 
408
    int repeatsteps = ui->captureBatchStepRepeatSpinBox->value();
-
 
409
    int repeatsequence = ui->captureBatchSequenceRepeatSpinBox->value();
390
    int angleStart = ui->captureBatchStartSpinBox->value();
410
    int angleStart = ui->captureBatchStartSpinBox->value();
391
    int angleEnd = ui->captureBatchEndSpinBox->value();
411
    int angleEnd = ui->captureBatchEndSpinBox->value();
392
    int angleStep = ui->captureBatchStepSpinBox->value();
412
    int angleStep = ui->captureBatchStepSpinBox->value();
393
 
413
 
394
    if(angleStart > angleEnd)
414
    if(angleStart > angleEnd)
395
        angleEnd += 360;
415
        angleEnd += 360;
396
 
416
 
397
    std::vector<float> angles;
417
    std::vector<float> angles;
398
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
418
    for(int i=angleStart; i<=angleEnd; i+=angleStep) {
399
        angles.push_back(i % 360);
419
        angles.push_back(i % 360);
-
 
420
        for(int j=1; j<repeatsteps; ++j)
-
 
421
            angles.push_back(-1);
-
 
422
    }
-
 
423
    for(int l=1; l<repeatsequence; ++l) {
-
 
424
        for(int i=angleStart; i<=angleEnd; i+=angleStep) {
-
 
425
            angles.push_back(i % 360);
-
 
426
            for(int j=1; j<repeatsteps; ++j)
-
 
427
                angles.push_back(-1);
-
 
428
        }
-
 
429
    }
400
 
430
 
401
    std::cout << "Aquiring sequences at ";
431
    std::cout << "Aquiring sequences at ";
402
    for(unsigned int i=0; i<angles.size(); i++)
432
    for(unsigned int i=0; i<angles.size(); i++)
403
        std::cout << angles[i] << " ";
433
        std::cout << angles[i] << " ";
404
    std::cout << " degrees" <<std::endl;
434
    std::cout << " degrees" <<std::endl;
Line 524... Line 554...
524
 
554
 
525
    progressDialog.show();
555
    progressDialog.show();
526
 
556
 
527
    cv::Mat frameBGR;
557
    cv::Mat frameBGR;
528
    for(unsigned int i=0; i<captureData.size(); i++){
558
    for(unsigned int i=0; i<captureData.size(); i++){
529
 
-
 
530
        QString format;
-
 
531
        if(captureData[i].frames0[0].depth() == CV_32F)
-
 
532
            format = "hdr";
-
 
533
        else
-
 
534
            format = "png";
-
 
535
 
-
 
536
        QString seqDirName = QString("%1/sequence_%2").arg(dirName).arg(i);
-
 
537
        if(!QDir().mkdir(seqDirName))
-
 
538
            std::cerr << "Could not create directory " << seqDirName.toStdString() << std::endl;
-
 
539
        for(unsigned int j=0; j<captureData[i].frames0.size(); j++){
-
 
540
 
-
 
541
            progressDialog.setValue(100.0*i/captureData.size() + 100.0/captureData.size()*j/captureData[i].frames0.size());
-
 
542
 
-
 
543
            QString fileName0 = QString("%1/frames0_%2.%3").arg(seqDirName).arg(j).arg(format);
-
 
544
 
-
 
545
            // Convert Bayer to rgb (png needs BGR order)
-
 
546
            if(captureData[i].frames0[j].type() == CV_8UC1)
-
 
547
                cv::cvtColor(captureData[i].frames0[j], frameBGR, CV_BayerBG2BGR);
-
 
548
            else
-
 
549
                cv::cvtColor(captureData[i].frames0[j], frameBGR, CV_RGB2BGR);
-
 
550
 
-
 
551
            cv::imwrite(fileName0.toStdString(), frameBGR);
-
 
552
 
-
 
553
            // Necessary to prevent pileup of video frame signals
-
 
554
            QCoreApplication::processEvents();
-
 
555
 
-
 
556
            QString fileName1 = QString("%1/frames1_%2.%3").arg(seqDirName).arg(j).arg(format);
-
 
557
 
-
 
558
            // Convert Bayer to rgb (png needs BGR order)
-
 
559
            if(captureData[i].frames1[j].type() == CV_8UC1)
-
 
560
                cv::cvtColor(captureData[i].frames1[j], frameBGR, CV_BayerBG2BGR);
-
 
561
            else
-
 
562
                cv::cvtColor(captureData[i].frames1[j], frameBGR, CV_RGB2BGR);
-
 
563
 
-
 
564
            cv::imwrite(fileName1.toStdString(), frameBGR);
-
 
565
 
-
 
566
            // Necessary to prevent pileup of video frame signals
-
 
567
            QCoreApplication::processEvents();
559
        emit exportFrameSequence(dirName, captureData[i]);
568
            if(progressDialog.wasCanceled())
-
 
569
                return;
-
 
570
        }
-
 
571
    }
560
    }
572
}
561
}
573
 
562
 
574
void SMScanner::on_actionExport_White_Frames_triggered(){
563
void SMScanner::on_actionExport_White_Frames_triggered(){
575
 
564
 
Line 628... Line 617...
628
            captureItem->setTextColor(0, QColor(0, 0, 0));
617
            captureItem->setTextColor(0, QColor(0, 0, 0));
629
            captureItem->setIcon(0, QIcon());
618
            captureItem->setIcon(0, QIcon());
630
        }
619
        }
631
   }
620
   }
632
 
621
 
-
 
622
    if (ui->exportCheckBox->isChecked()) {
-
 
623
        QString path = ui->exportPathLineEdit->text();
-
 
624
        for(unsigned int i = 0; i < captureData.size(); i++) {
-
 
625
            if (captureData[i].id == smCloud.id) {
-
 
626
                emit exportFrameSequence(path, captureData[i]);
-
 
627
                break;
-
 
628
            }
-
 
629
        }
-
 
630
    }
-
 
631
}
-
 
632
 
-
 
633
void SMScanner::onExportProgress(int progress) {
-
 
634
    ui->exportProgressBar->setEnabled(true);
-
 
635
    ui->abortExportPushButton->setEnabled(true);
-
 
636
    ui->exportProgressBar->setValue(progress);
-
 
637
}
-
 
638
 
-
 
639
void SMScanner::onAbortedExport() {
-
 
640
    ui->exportProgressBar->setEnabled(false);
-
 
641
    ui->abortExportPushButton->setEnabled(false);
-
 
642
    ui->exportProgressBar->setValue(100);
-
 
643
}
-
 
644
 
-
 
645
void SMScanner::onFinishedExport(int id) {
-
 
646
    if (ui->deleteExportCheckBox->isChecked()) {
-
 
647
        for(unsigned int i = 0; i < captureData.size(); i++) {
-
 
648
            if (captureData[i].id == id) {
-
 
649
                captureData.erase(captureData.begin()+i);
-
 
650
                ui->captureTreeWidget->takeTopLevelItem(i);
-
 
651
                break;
-
 
652
            }
-
 
653
        }
-
 
654
    }
-
 
655
    onAbortedExport();
633
}
656
}
634
 
657
 
635
void SMScanner::on_actionExport_Point_Clouds_triggered(){
658
void SMScanner::on_actionExport_Point_Clouds_triggered(){
636
 
659
 
637
    QString directory = QFileDialog::getExistingDirectory(this, "Export Point Clouds", QString());
660
    QString directory = QFileDialog::getExistingDirectory(this, "Export Point Clouds", QString());
Line 651... Line 674...
651
    // save point clouds in ply format
674
    // save point clouds in ply format
652
    for(unsigned int i=0; i<pointCloudData.size(); i++){
675
    for(unsigned int i=0; i<pointCloudData.size(); i++){
653
 
676
 
654
        progressDialog.setValue(100.0*i/pointCloudData.size());
677
        progressDialog.setValue(100.0*i/pointCloudData.size());
655
    if(pointCloudData[i].id != -1){
678
    if(pointCloudData[i].id != -1){
656
        QString fileName = QString("%1/pointcloud_%2.ply").arg(directory).arg(i);
679
        QString fileName = QString("%1/pointcloud_%2.ply").arg(directory).arg(pointCloudData[i].id);
657
        pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr pointCloudPCL(pointCloudData[i].pointCloud);
680
        pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr pointCloudPCL(pointCloudData[i].pointCloud);
658
        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
681
        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
659
        pcl::PLYWriter w;
682
        pcl::PLYWriter w;
660
        // Write to ply in binary without camera
683
        // Write to ply in binary without camera
661
        w.write<pcl::PointXYZRGBNormal> (fileName.toStdString(), *pointCloudPCL, true, false);
684
        w.write<pcl::PointXYZRGBNormal> (fileName.toStdString(), *pointCloudPCL, true, false);
Line 688... Line 711...
688
}
711
}
689
 
712
 
690
void SMScanner::on_pointCloudsListWidget_itemChanged(QListWidgetItem *item){
713
void SMScanner::on_pointCloudsListWidget_itemChanged(QListWidgetItem *item){
691
 
714
 
692
    int id = item->data(Qt::UserRole).toInt();
715
    int id = item->data(Qt::UserRole).toInt();
693
    assert((int)pointCloudData.size()>id);
716
    // assert((int)pointCloudData.size()>id);
694
 
717
 
695
    if(item->checkState() == Qt::Checked){
718
    if(item->checkState() == Qt::Checked){
696
        id = std::min(int(pointCloudData.size())-1,std::max(0,id));// clamp range
719
        id = std::min(int(pointCloudData.size())-1,std::max(0,id));// clamp range
697
        ui->pointCloudWidget->addPointCloud(pointCloudData[id], id);
720
        ui->pointCloudWidget->addPointCloud(pointCloudData[id], id);
698
    }
721
    }
Line 959... Line 982...
959
 
982
 
960
void SMScanner::on_actionEdit_Configuration_File_triggered()
983
void SMScanner::on_actionEdit_Configuration_File_triggered()
961
{
984
{
962
    QDesktopServices::openUrl(QUrl::fromLocalFile(settings.fileName()));
985
    QDesktopServices::openUrl(QUrl::fromLocalFile(settings.fileName()));
963
}
986
}
-
 
987
 
-
 
988
void SMScanner::on_exportCheckBox_toggled(bool checked)
-
 
989
{
-
 
990
    ui->exportPathLineEdit->setEnabled(checked);
-
 
991
    ui->browseExportPushButton->setEnabled(checked);
-
 
992
    ui->exportedPathLabel->setEnabled(checked);
-
 
993
    ui->deleteExportCheckBox->setEnabled(checked);
-
 
994
}
-
 
995
 
-
 
996
void SMScanner::on_browseExportPushButton_clicked()
-
 
997
{
-
 
998
    QString dirName = QFileDialog::getExistingDirectory(this, "Export frame sequences", QString());
-
 
999
    ui->exportPathLineEdit->setText(dirName);
-
 
1000
}