Subversion Repositories seema-scanner

Rev

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

Rev 74 Rev 75
Line 166... Line 166...
166
        angles.push_back(i % 360);
166
        angles.push_back(i % 360);
167
 
167
 
168
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSets", Q_ARG(std::vector<float>, angles));
168
    QMetaObject::invokeMethod(captureWorker, "acquireCalibrationSets", Q_ARG(std::vector<float>, angles));
169
 
169
 
170
    std::cout << "Aquiring sets at ";
170
    std::cout << "Aquiring sets at ";
171
    for(int i=0; i<angles.size(); i++)
171
    for(unsigned int i=0; i<angles.size(); i++)
172
        std::cout << angles[i] << " ";
172
        std::cout << angles[i] << " ";
173
    std::cout << " degrees" <<std::endl;
173
    std::cout << " degrees" <<std::endl;
174
}
174
}
175
 
175
 
176
 
176
 
Line 202... Line 202...
202
    // disable ui elements
202
    // disable ui elements
203
    ui->calibrateButton->setEnabled(false);
203
    ui->calibrateButton->setEnabled(false);
204
    ui->calibrationFrame->setEnabled(false);
204
    ui->calibrationFrame->setEnabled(false);
205
 
205
 
206
    // set checked flags
206
    // set checked flags
207
    for(int i=0; i<calibrationData.size(); i++){
207
    for(unsigned int i=0; i<calibrationData.size(); i++){
208
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
208
        calibrationData[i].checked = (ui->calibrationListWidget->item(i)->checkState() == Qt::Checked);
209
    }
209
    }
210
 
210
 
211
//    SMCalibrationWorker calibrationWorker;
211
//    SMCalibrationWorker calibrationWorker;
212
//    calibrationWorker.performCalibration(calibrationData);
212
//    calibrationWorker.performCalibration(calibrationData);
213
 
213
 
214
    // Set up calibration thread
214
    // Set up calibration thread
215
    calibrationWorker = new SMCalibrationWorker;
215
    calibrationWorker = new SMCalibrationWorker(this);
216
    calibrationWorkerThread = new QThread(this);
216
    calibrationWorkerThread = new QThread(this);
217
    calibrationWorkerThread->setObjectName("calibrationWorkerThread");
217
    calibrationWorkerThread->setObjectName("calibrationWorkerThread");
218
    calibrationWorker->moveToThread(captureWorkerThread);
218
    calibrationWorker->moveToThread(captureWorkerThread);
219
    calibrationWorkerThread->start();
219
    calibrationWorkerThread->start();
220
 
220
 
Line 324... Line 324...
324
    std::vector<float> angles;
324
    std::vector<float> angles;
325
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
325
    for(int i=angleStart; i<=angleEnd; i+=angleStep)
326
        angles.push_back(i % 360);
326
        angles.push_back(i % 360);
327
 
327
 
328
    std::cout << "Aquiring sequences at ";
328
    std::cout << "Aquiring sequences at ";
329
    for(int i=0; i<angles.size(); i++)
329
    for(unsigned int i=0; i<angles.size(); i++)
330
        std::cout << angles[i] << " ";
330
        std::cout << angles[i] << " ";
331
    std::cout << " degrees" <<std::endl;
331
    std::cout << " degrees" <<std::endl;
332
 
332
 
333
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequences", Q_ARG(std::vector<float>, angles));
333
    QMetaObject::invokeMethod(captureWorker, "acquireFrameSequences", Q_ARG(std::vector<float>, angles));
334
}
334
}
Line 357... Line 357...
357
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
357
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
358
    item->setData(0, Qt::UserRole, QPoint(captureData.size()-1, -1));
358
    item->setData(0, Qt::UserRole, QPoint(captureData.size()-1, -1));
359
    item->setCheckState(0, Qt::Checked);
359
    item->setCheckState(0, Qt::Checked);
360
    //ui->captureTreeWidget->addItem(item);
360
    //ui->captureTreeWidget->addItem(item);
361
 
361
 
362
    for(int i=0; i<frameSequence.frames0.size(); i++){
362
    for(unsigned int i=0; i<frameSequence.frames0.size(); i++){
363
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
363
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
364
        subItem->setText(0, QString("frames %1").arg(i));
364
        subItem->setText(0, QString("frames %1").arg(i));
365
        subItem->setData(0, Qt::UserRole, QPoint(id, i));
365
        subItem->setData(0, Qt::UserRole, QPoint(id, i));
366
    }
366
    }
367
 
367
 
Line 401... Line 401...
401
}
401
}
402
 
402
 
403
void SMScanner::on_actionExport_Sets_triggered(){
403
void SMScanner::on_actionExport_Sets_triggered(){
404
 
404
 
405
    QString dirName = QFileDialog::getExistingDirectory(this, "Export calibration sets", QString());
405
    QString dirName = QFileDialog::getExistingDirectory(this, "Export calibration sets", QString());
406
    for(int i=0; i<calibrationData.size(); i++){
406
    for(unsigned int i=0; i<calibrationData.size(); i++){
407
        QString fileName = QString("%1/frame0_%2.png").arg(dirName).arg(i);
407
        QString fileName = QString("%1/frame0_%2.png").arg(dirName).arg(i);
408
        cv::Mat frameBGR;
408
        cv::Mat frameBGR;
409
        cv::cvtColor(calibrationData[i].frame0, frameBGR, CV_RGB2BGR);
409
        cv::cvtColor(calibrationData[i].frame0, frameBGR, CV_RGB2BGR);
410
        cv::imwrite(fileName.toStdString(), frameBGR);
410
        cv::imwrite(fileName.toStdString(), frameBGR);
411
        fileName = QString("%1/frame1_%2.png").arg(dirName).arg(i);
411
        fileName = QString("%1/frame1_%2.png").arg(dirName).arg(i);
Line 417... Line 417...
417
 
417
 
418
void SMScanner::on_actionExport_Sequences_triggered(){
418
void SMScanner::on_actionExport_Sequences_triggered(){
419
 
419
 
420
    QString dirName = QFileDialog::getExistingDirectory(this, "Export frame sequences", QString());
420
    QString dirName = QFileDialog::getExistingDirectory(this, "Export frame sequences", QString());
421
 
421
 
422
    for(int i=0; i<captureData.size(); i++){
422
    for(unsigned int i=0; i<captureData.size(); i++){
423
        QString seqDirName = QString("%1/sequence_%2").arg(dirName).arg(i);
423
        QString seqDirName = QString("%1/sequence_%2").arg(dirName).arg(i);
424
        if(!QDir().mkdir(seqDirName))
424
        if(!QDir().mkdir(seqDirName))
425
            std::cerr << "Could not create directory " << seqDirName.toStdString() << std::endl;
425
            std::cerr << "Could not create directory " << seqDirName.toStdString() << std::endl;
426
        for(int j=0; j<captureData[i].frames0.size(); j++){
426
        for(unsigned int j=0; j<captureData[i].frames0.size(); j++){
427
            QString fileName = QString("%1/frames0_%2.png").arg(seqDirName).arg(j);
427
            QString fileName = QString("%1/frames0_%2.png").arg(seqDirName).arg(j);
428
            cv::Mat frameBGR;
428
            cv::Mat frameBGR;
429
            cv::cvtColor(captureData[i].frames0[j], frameBGR, CV_RGB2BGR);
429
            cv::cvtColor(captureData[i].frames0[j], frameBGR, CV_RGB2BGR);
430
            cv::imwrite(fileName.toStdString(), frameBGR);
430
            cv::imwrite(fileName.toStdString(), frameBGR);
431
        }
431
        }
432
        for(int j=0; j<captureData[i].frames1.size(); j++){
432
        for(unsigned int j=0; j<captureData[i].frames1.size(); j++){
433
            QString fileName = QString("%1/frames1_%2.png").arg(seqDirName).arg(j);
433
            QString fileName = QString("%1/frames1_%2.png").arg(seqDirName).arg(j);
434
            cv::Mat frameBGR;
434
            cv::Mat frameBGR;
435
            cv::cvtColor(captureData[i].frames1[j], frameBGR, CV_RGB2BGR);
435
            cv::cvtColor(captureData[i].frames1[j], frameBGR, CV_RGB2BGR);
436
            cv::imwrite(fileName.toStdString(), frameBGR);
436
            cv::imwrite(fileName.toStdString(), frameBGR);
437
        }
437
        }
Line 453... Line 453...
453
    connect(reconstructionWorker, SIGNAL(done()), reconstructionWorker, SLOT(deleteLater()));
453
    connect(reconstructionWorker, SIGNAL(done()), reconstructionWorker, SLOT(deleteLater()));
454
 
454
 
455
    // Start reconstructing
455
    // Start reconstructing
456
    QMetaObject::invokeMethod(reconstructionWorker, "setup");
456
    QMetaObject::invokeMethod(reconstructionWorker, "setup");
457
 
457
 
458
    for(int i=0; i<captureData.size(); i++){
458
    for(unsigned int i=0; i<captureData.size(); i++){
459
        if(!captureData[i].reconstructed & ui->captureTreeWidget->topLevelItem(i)->checkState(0) == Qt::Checked)
459
        if(!captureData[i].reconstructed & (ui->captureTreeWidget->topLevelItem(i)->checkState(0) == Qt::Checked))
460
            QMetaObject::invokeMethod(reconstructionWorker, "reconstructPointCloud", Q_ARG(SMFrameSequence, captureData[i]));
460
            QMetaObject::invokeMethod(reconstructionWorker, "reconstructPointCloud", Q_ARG(SMFrameSequence, captureData[i]));
461
    }
461
    }
462
 
462
 
463
}
463
}
464
 
464
 
Line 493... Line 493...
493
//    saveDirectoryDialog.exec();
493
//    saveDirectoryDialog.exec();
494
//    QString directory = saveDirectoryDialog.directory().path();
494
//    QString directory = saveDirectoryDialog.directory().path();
495
//    QString type = saveDirectoryDialog.selectedNameFilter();
495
//    QString type = saveDirectoryDialog.selectedNameFilter();
496
 
496
 
497
    // save point clouds in ply format
497
    // save point clouds in ply format
498
    for(int i=0; i<pointCloudData.size(); i++){
498
    for(unsigned int i=0; i<pointCloudData.size(); i++){
499
        QString fileName = QString("%1/pointcloud_%2.ply").arg(directory).arg(i);
499
        QString fileName = QString("%1/pointcloud_%2.ply").arg(directory).arg(i);
500
        pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointCloudPCL(pointCloudData[i].pointCloud);
500
        pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointCloudPCL(pointCloudData[i].pointCloud);
501
        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
501
        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
502
        pcl::PLYWriter w;
502
        pcl::PLYWriter w;
503
        // Write to ply in binary without camera
503
        // Write to ply in binary without camera
Line 505... Line 505...
505
    }
505
    }
506
 
506
 
507
    // save meshlab aln project file
507
    // save meshlab aln project file
508
    std::ofstream s(QString("%1/alignment.aln").arg(directory).toLocal8Bit());
508
    std::ofstream s(QString("%1/alignment.aln").arg(directory).toLocal8Bit());
509
    s << pointCloudData.size() << std::endl;
509
    s << pointCloudData.size() << std::endl;
510
    for(int i=0; i<pointCloudData.size(); i++){
510
    for(unsigned int i=0; i<pointCloudData.size(); i++){
511
        QString fileName = QString("pointcloud_%1.ply").arg(i);
511
        QString fileName = QString("pointcloud_%1.ply").arg(i);
512
        s << fileName.toStdString() << std::endl << "#" << std::endl;
512
        s << fileName.toStdString() << std::endl << "#" << std::endl;
513
        cv::Mat Tr = cv::Mat::eye(4, 4, CV_32F);
513
        cv::Mat Tr = cv::Mat::eye(4, 4, CV_32F);
514
        cv::Mat(pointCloudData[i].R.t()).copyTo(Tr.colRange(0, 3).rowRange(0, 3));
514
        cv::Mat(pointCloudData[i].R.t()).copyTo(Tr.colRange(0, 3).rowRange(0, 3));
515
        cv::Mat(-pointCloudData[i].R.t()*pointCloudData[i].T).copyTo(Tr.col(3).rowRange(0, 3));
515
        cv::Mat(-pointCloudData[i].R.t()*pointCloudData[i].T).copyTo(Tr.col(3).rowRange(0, 3));