Subversion Repositories seema-scanner

Rev

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

Rev 44 Rev 45
Line 23... Line 23...
23
    qRegisterMetaType<SMCalibrationParameters>("SMCalibrationParameters");
23
    qRegisterMetaType<SMCalibrationParameters>("SMCalibrationParameters");
24
    qRegisterMetaTypeStreamOperators<SMCalibrationParameters>("SMCalibrationParameters");
24
    qRegisterMetaTypeStreamOperators<SMCalibrationParameters>("SMCalibrationParameters");
25
    qRegisterMetaType< std::vector<SMCalibrationSet> >("std::vector<SMCalibrationSet>");
25
    qRegisterMetaType< std::vector<SMCalibrationSet> >("std::vector<SMCalibrationSet>");
26
    qRegisterMetaType<SMFrameSequence>("SMFrameSequence");
26
    qRegisterMetaType<SMFrameSequence>("SMFrameSequence");
27
    qRegisterMetaType< std::vector<SMFrameSequence> >("std::vector<SMFrameSequence>");
27
    qRegisterMetaType< std::vector<SMFrameSequence> >("std::vector<SMFrameSequence>");
28
    qRegisterMetaType<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr>("pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr");
28
    qRegisterMetaType<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>("pcl::PointCloud<pcl::PointXYZRGB>::Ptr");
29
    qRegisterMetaType<SMPointCloud>("SMPointCloud");
29
    qRegisterMetaType<SMPointCloud>("SMPointCloud");
30
 
30
 
31
    // Setup ui (requires stream operators registered)
31
    // Setup ui (requires stream operators registered)
32
    ui->setupUi(this);
32
    ui->setupUi(this);
33
 
33
 
Line 311... Line 311...
311
    ui->calibrationRotationDial->setValue(ui->captureRotationDial->value());
311
    ui->calibrationRotationDial->setValue(ui->captureRotationDial->value());
312
}
312
}
313
 
313
 
314
void SMScanner::onReceiveFrameSequence(SMFrameSequence frameSequence){
314
void SMScanner::onReceiveFrameSequence(SMFrameSequence frameSequence){
315
 
315
 
316
    captureData.push_back(frameSequence);
316
    int id = captureData.size();
-
 
317
    frameSequence.id = id;
317
 
318
 
318
    int idx = captureData.size()-1;
319
    captureData.push_back(frameSequence);
319
 
320
 
320
    // Add identifier to list
321
    // Add identifier to list
321
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->captureTreeWidget);
322
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->captureTreeWidget);
322
    item->setText(0, QString("Frame Sequence %1 -- %2 deg").arg(idx).arg(frameSequence.rotationAngle));
323
    item->setText(0, QString("Frame Sequence %1 -- %2 deg").arg(id).arg(frameSequence.rotationAngle));
323
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
324
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
324
    item->setData(0, Qt::UserRole, QPoint(idx, -1));
325
    item->setData(0, Qt::UserRole, QPoint(id, -1));
325
    item->setCheckState(0, Qt::Checked);
326
    item->setCheckState(0, Qt::Checked);
326
    //ui->captureTreeWidget->addItem(item);
327
    //ui->captureTreeWidget->addItem(item);
327
 
328
 
328
    for(int i=0; i<frameSequence.frames0.size(); i++){
329
    for(int i=0; i<frameSequence.frames0.size(); i++){
329
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
330
        QTreeWidgetItem* subItem = new QTreeWidgetItem(item);
330
        subItem->setText(0, QString("frames %1").arg(i));
331
        subItem->setText(0, QString("frames %1").arg(i));
331
        subItem->setData(0, Qt::UserRole, QPoint(idx, i));
332
        subItem->setData(0, Qt::UserRole, QPoint(id, i));
332
    }
333
    }
333
 
334
 
334
    ui->reconstructButton->setEnabled(true);
335
    ui->reconstructButton->setEnabled(true);
335
}
336
}
336
 
337
 
Line 404... Line 405...
404
    }
405
    }
405
}
406
}
406
 
407
 
407
void SMScanner::on_reconstructButton_clicked(){
408
void SMScanner::on_reconstructButton_clicked(){
408
 
409
 
409
//    // set checked flags
-
 
410
//    for(int i=0; i<captureData.size(); i++){
-
 
411
//        captureData[i].checked = (ui->captureTreeWidget->item(i)->checkState() == Qt::Checked);
-
 
412
//    }
-
 
413
 
-
 
414
 
-
 
415
    // Set up reconstruction thread
410
    // Set up reconstruction thread
416
    reconstructionWorker = new SMReconstructionWorker;
411
    reconstructionWorker = new SMReconstructionWorker;
417
    reconstructionWorkerThread = new QThread(this);
412
    reconstructionWorkerThread = new QThread(this);
418
    reconstructionWorkerThread->setObjectName("reconstructionWorkerThread");
413
    reconstructionWorkerThread->setObjectName("reconstructionWorkerThread");
419
    reconstructionWorker->moveToThread(reconstructionWorkerThread);
414
    reconstructionWorker->moveToThread(reconstructionWorkerThread);
Line 424... Line 419...
424
    connect(reconstructionWorker, SIGNAL(done()), reconstructionWorkerThread, SLOT(quit()));
419
    connect(reconstructionWorker, SIGNAL(done()), reconstructionWorkerThread, SLOT(quit()));
425
    connect(reconstructionWorker, SIGNAL(done()), reconstructionWorker, SLOT(deleteLater()));
420
    connect(reconstructionWorker, SIGNAL(done()), reconstructionWorker, SLOT(deleteLater()));
426
 
421
 
427
    // Start reconstructing
422
    // Start reconstructing
428
    QMetaObject::invokeMethod(reconstructionWorker, "setup");
423
    QMetaObject::invokeMethod(reconstructionWorker, "setup");
-
 
424
 
-
 
425
    std::vector<SMFrameSequence> data;
-
 
426
    for(int i=0; i<captureData.size(); i++){
-
 
427
        if(!captureData[i].reconstructed & ui->captureTreeWidget->itemAt(QPoint(i, 0))->checkState(0) == Qt::Checked)
429
    QMetaObject::invokeMethod(reconstructionWorker, "reconstructPointClouds", Q_ARG(std::vector<SMFrameSequence>, captureData));
428
            QMetaObject::invokeMethod(reconstructionWorker, "reconstructPointCloud", Q_ARG(SMFrameSequence, captureData[i]));
-
 
429
    }
430
 
430
 
431
}
431
}
432
 
432
 
433
void SMScanner::onNewPointCloud(SMPointCloud smCloud){
433
void SMScanner::onNewPointCloud(SMPointCloud smCloud){
434
 
434
 
-
 
435
    int id = smCloud.id;
-
 
436
    captureData[id].reconstructed = true;
-
 
437
 
435
    pointCloudData.push_back(smCloud);
438
    pointCloudData.push_back(smCloud);
436
    int id = pointCloudData.size()-1;
-
 
437
 
439
 
438
    // Add identifier to list
440
    // Add identifier to list
439
    QListWidgetItem* item = new QListWidgetItem(QString("Point Cloud %1 -- %2 deg").arg(id).arg(smCloud.rotationAngle), ui->pointCloudsListWidget);
441
    QListWidgetItem* item = new QListWidgetItem(QString("Point Cloud %1 -- %2 deg").arg(id).arg(smCloud.rotationAngle), ui->pointCloudsListWidget);
440
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
442
    item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
441
    item->setData(Qt::UserRole, QVariant(id));
443
    item->setData(Qt::UserRole, QVariant(id));
Line 461... Line 463...
461
//    QString type = saveDirectoryDialog.selectedNameFilter();
463
//    QString type = saveDirectoryDialog.selectedNameFilter();
462
 
464
 
463
    // save point clouds in ply format
465
    // save point clouds in ply format
464
    for(int i=0; i<pointCloudData.size(); i++){
466
    for(int i=0; i<pointCloudData.size(); i++){
465
        QString fileName = QString("%1/pointcloud_%2.ply").arg(directory).arg(i);
467
        QString fileName = QString("%1/pointcloud_%2.ply").arg(directory).arg(i);
466
        pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr pointCloudPCL(pointCloudData[i].pointCloud);
468
        pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointCloudPCL(pointCloudData[i].pointCloud);
467
        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
469
        //pcl::io::savePLYFileBinary(fileName.toStdString(), *pointCloudPCL);
468
        pcl::PLYWriter w;
470
        pcl::PLYWriter w;
469
        // Write to ply in binary without camera
471
        // Write to ply in binary without camera
470
        w.write<pcl::PointXYZRGBNormal> (fileName.toStdString(), *pointCloudPCL, true, false);
472
        w.write<pcl::PointXYZRGB> (fileName.toStdString(), *pointCloudPCL, true, false);
471
    }
473
    }
472
 
474
 
473
    // save meshlab aln project file
475
    // save meshlab aln project file
474
    std::ofstream s(QString("%1/alignment.aln").arg(directory).toLocal8Bit());
476
    std::ofstream s(QString("%1/alignment.aln").arg(directory).toLocal8Bit());
475
    s << pointCloudData.size() << std::endl;
477
    s << pointCloudData.size() << std::endl;