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