template <typename PointInT, typename PointNT, typename PointOutT> void pcl::GFPFHEstimation<PointInT, PointNT, PointOutT>::computeFeature (PointCloudOut &output) { pcl::octree::OctreePointCloudSearch<PointInT> octree (octree_leaf_size_); octree.setInputCloud (input_); octree.addPointsFromInputCloud (); typename pcl::PointCloud<PointInT>::VectorType occupied_cells; octree.getOccupiedVoxelCenters (occupied_cells); // Determine the voxels crosses along the line segments // formed by every pair of occupied cells. std::vector< std::vector<int> > line_histograms; for (size_t i = 0; i < occupied_cells.size (); ++i) { Eigen::Vector3f origin = occupied_cells[i].getVector3fMap (); for (size_t j = i+1; j < occupied_cells.size (); ++j) { typename pcl::PointCloud<PointInT>::VectorType intersected_cells; Eigen::Vector3f end = occupied_cells[j].getVector3fMap (); octree.getApproxIntersectedVoxelCentersBySegment (origin, end, intersected_cells, 0.5f); // Intersected cells are ordered from closest to furthest w.r.t. the origin. std::vector<int> histogram; for (size_t k = 0; k < intersected_cells.size (); ++k) { std::vector<int> indices; octree.voxelSearch (intersected_cells[k], indices); int label = emptyLabel (); if (indices.size () != 0) { label = getDominantLabel (indices); } histogram.push_back (label); } line_histograms.push_back(histogram); } } std::vector< std::vector<int> > transition_histograms; computeTransitionHistograms (line_histograms, transition_histograms); std::vector<float> distances; computeDistancesToMean (transition_histograms, distances); std::vector<float> gfpfh_histogram; computeDistanceHistogram (distances, gfpfh_histogram); output.clear (); output.width = 1; output.height = 1; output.points.resize (1); std::copy (gfpfh_histogram.begin (), gfpfh_histogram.end (), output.points[0].histogram); }
int QUndoView::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QListView::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { if (_id < 2) qt_static_metacall(this, _c, _id, _a); _id -= 2; } #ifndef QT_NO_PROPERTIES else if (_c == QMetaObject::ReadProperty) { void *_v = _a[0]; switch (_id) { case 0: *reinterpret_cast< QString*>(_v) = emptyLabel(); break; case 1: *reinterpret_cast< QIcon*>(_v) = cleanIcon(); break; } _id -= 2; } else if (_c == QMetaObject::WriteProperty) { void *_v = _a[0]; switch (_id) { case 0: setEmptyLabel(*reinterpret_cast< QString*>(_v)); break; case 1: setCleanIcon(*reinterpret_cast< QIcon*>(_v)); break; } _id -= 2; } else if (_c == QMetaObject::ResetProperty) { _id -= 2; } else if (_c == QMetaObject::QueryPropertyDesignable) { _id -= 2; } else if (_c == QMetaObject::QueryPropertyScriptable) { _id -= 2; } else if (_c == QMetaObject::QueryPropertyStored) { _id -= 2; } else if (_c == QMetaObject::QueryPropertyEditable) { _id -= 2; } else if (_c == QMetaObject::QueryPropertyUser) { _id -= 2; } #endif // QT_NO_PROPERTIES return _id; }
template <typename PointInT, typename PointNT, typename PointOutT> boost::uint32_t pcl::GFPFHEstimation<PointInT, PointNT, PointOutT>::getDominantLabel (const std::vector<int>& indices) { std::vector<uint32_t> counts (getNumberOfClasses () + 1, 0); for (size_t i = 0; i < indices.size (); ++i) { uint32_t label = labels_->points[indices[i]].label; counts[label] += 1; } std::vector<uint32_t>::const_iterator max_it; max_it = std::max_element (counts.begin (), counts.end ()); if (max_it == counts.end ()) return (emptyLabel ()); return (static_cast<uint32_t> (max_it - counts.begin ())); }