40 #ifndef PCL_SEGMENTATION_GRABCUT
41 #define PCL_SEGMENTATION_GRABCUT
43 #include <pcl/point_cloud.h>
44 #include <pcl/pcl_base.h>
45 #include <pcl/point_types.h>
46 #include <pcl/segmentation/boost.h>
47 #include <pcl/search/search.h>
51 namespace segmentation
82 addNodes (std::size_t n = 1);
88 addSourceEdge (
int u,
double cap);
91 addTargetEdge (
int u,
double cap);
95 addEdge (
int u,
int v,
double cap_uv,
double cap_vu = 0.0);
107 operator() (
int u,
int v)
const;
110 getSourceEdgeCapacity (
int u)
const;
113 getTargetEdgeCapacity (
int u)
const;
117 typedef enum { FREE = 0x00, SOURCE = 0x01, TARGET = 0x02 } nodestate;
121 typedef std::pair<capacitated_edge::iterator, capacitated_edge::iterator>
edge_pair;
133 augmentPath (
const std::pair<int, int>& path, std::deque<int>& orphans);
136 adoptOrphans (std::deque<int>& orphans);
144 isActive (
int u)
const {
return ((u == active_head_) || (active_list_[u].first != TERMINAL)); }
150 markInactive (
int u);
160 std::vector<unsigned char>
cut_;
164 static const int TERMINAL = -1;
166 std::vector<std::pair<int, edge_pair> > parents_;
168 std::vector<std::pair<int, int> > active_list_;
169 int active_head_, active_tail_;
176 Color (
float _r,
float _g,
float _b) :
r(_r),
g(_g),
b(_b) {}
179 template<
typename Po
intT>
182 template<
typename Po
intT>
224 GMM () : gaussians_ (0) {}
226 GMM (std::size_t
K) : gaussians_ (K) {}
231 getK ()
const {
return gaussians_.size (); }
234 resize (std::size_t
K) { gaussians_.resize (K); }
237 operator[] (std::size_t pos) {
return (gaussians_[pos]); }
240 operator[] (std::size_t pos)
const {
return (gaussians_[pos]); }
243 probabilityDensity (
const Color &c);
246 probabilityDensity(std::size_t i,
const Color &c);
250 std::vector<Gaussian> gaussians_;
258 : sum_ (Eigen::Vector3f::Zero ())
259 , accumulator_ (Eigen::Matrix3f::Zero ())
269 fit (
Gaussian& g, std::size_t total_count,
bool compute_eigens =
false)
const;
282 Eigen::Vector3f sum_;
284 Eigen::Matrix3f accumulator_;
294 const std::vector<int>& indices,
295 const std::vector<SegmentationValue> &hardSegmentation,
296 std::vector<std::size_t> &components,
297 GMM &background_GMM, GMM &foreground_GMM);
301 const std::vector<int>& indices,
302 const std::vector<SegmentationValue>& hard_segmentation,
303 std::vector<std::size_t>& components,
304 GMM& background_GMM, GMM& foreground_GMM);
316 template <
typename Po
intT>
393 extract (std::vector<pcl::PointIndices>& clusters);
467 std::vector<segmentation::grabcut::TrimapValue>
trimap_;
481 #include <pcl/segmentation/impl/grabcut_segmentation.hpp>