/** * compute the normals using a mask */ void ZAdaptiveNormals::compute(const v4r::DataMatrix2D<Eigen::Vector3f> &cloud, const std::vector<int> &indices, std::vector<Eigen::Vector3f> &normals) { width = cloud.cols; height = cloud.rows; normals.resize(indices.size()); estimateNormals(cloud, indices, normals); }
/** * compute the normals */ void ZAdaptiveNormals::compute(const v4r::DataMatrix2D<Eigen::Vector3f> &cloud, v4r::DataMatrix2D<Eigen::Vector3f> &normals) { width = cloud.cols; height = cloud.rows; normals.resize(height, width); estimateNormals(cloud, normals); }
/** * @brief It computes de boundary of a cloud. The mask must have at least one element. * * @param cloud Cloud in which the boundary are computed. */ void PlaneSegmentation::computeBoundary(const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr &cloud) { // Compute normals. pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>()); estimateNormals(cloud, normals, 0.015); // Ignore points with a different normal. pcl::PointIndices::Ptr filtIndices(new pcl::PointIndices()); filterByNormal(normals, maskIndices, coefficients, 15.0, filtIndices); // Project point cloud to a plane. pcl::ModelCoefficients::ConstPtr coefPtr = boost::make_shared<pcl::ModelCoefficients>(coefficients); pcl::PointCloud<pcl::PointXYZRGBA>::Ptr projectedCloud = pcl::PointCloud<pcl::PointXYZRGBA>::Ptr(new pcl::PointCloud<pcl::PointXYZRGBA>()); projectToPlane(cloud, coefPtr, projectedCloud); // Clustering. std::vector<pcl::PointIndices> clusterIndices; clustering(projectedCloud, filtIndices, 0.02, 5000, clusterIndices); assert(clusterIndices.size() > 0); // Find the biggest cluster. int max_size = clusterIndices[0].indices.size(); int max_pos = 0; for(int i = 0; i < clusterIndices.size(); i++) { if (clusterIndices[i].indices.size() > max_size) { max_size = clusterIndices[i].indices.size(); max_pos = i; } } pcl::PointIndices::ConstPtr clusterIndicesPtr = boost::make_shared<pcl::PointIndices>(clusterIndices[max_pos]); // Compute the convex hull of the cluster. pcl::PointIndices hullIndices = pcl::PointIndices(); findConvexHull(projectedCloud, clusterIndicesPtr, hullIndices); pcl::PointIndices::ConstPtr hullIndicesPtr = boost::make_shared<pcl::PointIndices>(hullIndices); // Simplify convex polygon. pcl::PointIndices boundaryIndices; polygonSimplification(projectedCloud, hullIndicesPtr, coefficients.values, 4, boundaryIndices); // Copy boundary points. boundary = std::vector<pcl::PointXYZRGBA>(boundaryIndices.indices.size()); for(int j = 0; j < boundary.size(); j++) { boundary[j] = cloud->points[boundaryIndices.indices[j]]; } }
void kpoAnalyzerThread::operator ()() { std::cout << "cloud has " << scene_cloud_->size() << " points" << std::endl; Cloud cleanCloud; removeNoise(scene_cloud_, cleanCloud); pcl::copyPointCloud(cleanCloud, *scene_cloud_); std::cout << "filtered cloud has " << scene_cloud_->size() << " points" << std::endl; /* if (scene_cloud_->size() < 25) { std::cout << "cloud too small" << std::endl; return; } /* if (scene_cloud_->size() > 40000) { std::cout << "cloud too large" << std::endl; return; } */ NormalCloud::Ptr scene_normals_(new NormalCloud()); estimateNormals(scene_cloud_, scene_normals_); Cloud::Ptr scene_keypoints_(new Cloud()); downSample(scene_cloud_, scene_keypoints_); DescriptorCloud::Ptr scene_descriptors_(new DescriptorCloud()); computeShotDescriptors(scene_cloud_, scene_keypoints_, scene_normals_, scene_descriptors_); RFCloud::Ptr scene_refs_(new RFCloud()); estimateReferenceFrames(scene_cloud_, scene_normals_, scene_keypoints_, scene_refs_); kpoCloudDescription od; od.cloud = *scene_cloud_; od.keypoints = *scene_keypoints_; od.normals = *scene_normals_; od.descriptors = *scene_descriptors_; od.reference_frames = *scene_refs_; od.filename = filename; od.object_id = object_id; callback_(od); }
void LVRMainWindow::connectSignalsAndSlots() { QObject::connect(m_actionOpen, SIGNAL(activated()), this, SLOT(loadModel())); QObject::connect(m_actionExport, SIGNAL(activated()), this, SLOT(exportSelectedModel())); QObject::connect(treeWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showTreeContextMenu(const QPoint&))); QObject::connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(restoreSliders(QTreeWidgetItem*, int))); QObject::connect(treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(setModelVisibility(QTreeWidgetItem*, int))); QObject::connect(m_actionQuit, SIGNAL(activated()), qApp, SLOT(quit())); QObject::connect(m_actionShowColorDialog, SIGNAL(activated()), this, SLOT(showColorDialog())); QObject::connect(m_actionRenameModelItem, SIGNAL(activated()), this, SLOT(renameModelItem())); QObject::connect(m_actionDeleteModelItem, SIGNAL(activated()), this, SLOT(deleteModelItem())); QObject::connect(m_actionExportModelTransformed, SIGNAL(activated()), this, SLOT(exportSelectedModel())); QObject::connect(m_actionReset_Camera, SIGNAL(activated()), this, SLOT(updateView())); QObject::connect(m_actionStore_Current_View, SIGNAL(activated()), this, SLOT(saveCamera())); QObject::connect(m_actionRecall_Stored_View, SIGNAL(activated()), this, SLOT(loadCamera())); QObject::connect(m_actionCameraPathTool, SIGNAL(activated()), this, SLOT(openCameraPathTool())); QObject::connect(m_actionEstimate_Normals, SIGNAL(activated()), this, SLOT(estimateNormals())); QObject::connect(m_actionMarching_Cubes, SIGNAL(activated()), this, SLOT(reconstructUsingMarchingCubes())); QObject::connect(m_actionPlanar_Marching_Cubes, SIGNAL(activated()), this, SLOT(reconstructUsingPlanarMarchingCubes())); QObject::connect(m_actionExtended_Marching_Cubes, SIGNAL(activated()), this, SLOT(reconstructUsingExtendedMarchingCubes())); QObject::connect(m_actionPlanar_Optimization, SIGNAL(activated()), this, SLOT(optimizePlanes())); QObject::connect(m_actionRemove_Artifacts, SIGNAL(activated()), this, SLOT(removeArtifacts())); QObject::connect(m_actionRemove_Outliers, SIGNAL(activated()), this, SLOT(removeOutliers())); QObject::connect(m_actionMLS_Projection, SIGNAL(activated()), this, SLOT(applyMLSProjection())); QObject::connect(m_actionICP_Using_Manual_Correspondance, SIGNAL(activated()), this, SLOT(manualICP())); QObject::connect(m_menuAbout, SIGNAL(triggered(QAction*)), this, SLOT(showAboutDialog(QAction*))); QObject::connect(m_correspondanceDialog->m_dialog, SIGNAL(accepted()), m_pickingInteractor, SLOT(correspondenceSearchOff())); QObject::connect(m_correspondanceDialog->m_dialog, SIGNAL(accepted()), this, SLOT(alignPointClouds())); QObject::connect(m_correspondanceDialog->m_dialog, SIGNAL(rejected()), m_pickingInteractor, SLOT(correspondenceSearchOff())); QObject::connect(m_correspondanceDialog, SIGNAL(addArrow(LVRVtkArrow*)), this, SLOT(addArrow(LVRVtkArrow*))); QObject::connect(m_correspondanceDialog, SIGNAL(removeArrow(LVRVtkArrow*)), this, SLOT(removeArrow(LVRVtkArrow*))); QObject::connect(m_correspondanceDialog, SIGNAL(disableCorrespondenceSearch()), m_pickingInteractor, SLOT(correspondenceSearchOff())); QObject::connect(m_correspondanceDialog, SIGNAL(enableCorrespondenceSearch()), m_pickingInteractor, SLOT(correspondenceSearchOn())); QObject::connect(m_actionShow_Points, SIGNAL(toggled(bool)), this, SLOT(togglePoints(bool))); QObject::connect(m_actionShow_Normals, SIGNAL(toggled(bool)), this, SLOT(toggleNormals(bool))); QObject::connect(m_actionShow_Mesh, SIGNAL(toggled(bool)), this, SLOT(toggleMeshes(bool))); QObject::connect(m_actionShow_Wireframe, SIGNAL(toggled(bool)), this, SLOT(toggleWireframe(bool))); QObject::connect(m_actionShowBackgroundSettings, SIGNAL(activated()), this, SLOT(showBackgroundDialog())); QObject::connect(m_horizontalSliderPointSize, SIGNAL(valueChanged(int)), this, SLOT(changePointSize(int))); QObject::connect(m_horizontalSliderTransparency, SIGNAL(valueChanged(int)), this, SLOT(changeTransparency(int))); QObject::connect(m_comboBoxShading, SIGNAL(currentIndexChanged(int)), this, SLOT(changeShading(int))); QObject::connect(m_buttonCameraPathTool, SIGNAL(pressed()), this, SLOT(openCameraPathTool())); QObject::connect(m_buttonCreateMesh, SIGNAL(pressed()), this, SLOT(reconstructUsingMarchingCubes())); QObject::connect(m_buttonExportData, SIGNAL(pressed()), this, SLOT(exportSelectedModel())); QObject::connect(m_buttonTransformModel, SIGNAL(pressed()), this, SLOT(showTransformationDialog())); QObject::connect(m_pickingInteractor, SIGNAL(firstPointPicked(double*)),m_correspondanceDialog, SLOT(firstPointPicked(double*))); QObject::connect(m_pickingInteractor, SIGNAL(secondPointPicked(double*)),m_correspondanceDialog, SLOT(secondPointPicked(double*))); QObject::connect(this, SIGNAL(correspondenceDialogOpened()), m_pickingInteractor, SLOT(correspondenceSearchOn())); }