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;
|