BitmapPrimitiveShape.h
Go to the documentation of this file.
1 #ifndef BITMAPPRIMITIVESHAPE_HEADER
2 #define BITMAPPRIMITIVESHAPE_HEADER
3 #include <algorithm>
4 #include <istream>
5 
6 #include "BasePrimitiveShape.h"
7 #include "IndexIterator.h"
8 #include <GfxTL/AABox.h>
10 #include <GfxTL/MathHelper.h>
11 #include <MiscLib/Pair.h>
12 #include <MiscLib/Performance.h>
13 #include <MiscLib/Vector.h>
14 #ifdef DOPARALLEL
15 #include <omp.h>
16 #endif
17 
18 #ifndef DLL_LINKAGE
19 #define DLL_LINKAGE
20 #endif
21 
22 struct BitmapInfo
23 {
28  size_t uextent, vextent;
29 };
30 
32 {
33 public:
34  bool Init(bool binary, std::istream* i);
35  size_t ConnectedComponent(const PointCloud& pc,
36  float epsilon,
38  bool doFiltering = true,
39  float* borderRatio = 0);
40  size_t AllConnectedComponents(const PointCloud& pc,
41  float epsilon,
42  BitmapInfo& bitmapInfo,
44  MiscLib::Vector<int>& componentsImg,
45  MiscLib::Vector<std::pair<int, size_t>>& labels,
46  bool doFiltering = true);
47  void TrimmingPolygons(const PointCloud& pc,
48  float epsilon,
49  size_t begin,
50  size_t end,
51  std::deque<ComponentPolygons>* polys) const;
53  float epsilon,
54  size_t begin,
55  size_t end,
56  PointCloud* bmpPc) const;
57 
58 public:
59  virtual void Parameters(const Vec3f& p, std::pair<float, float>* param) const = 0;
60  virtual bool InSpace(float u, float v, Vec3f* p, Vec3f* n) const = 0;
61  virtual void Parameters(
64  MiscLib::Vector<std::pair<float, float>>* bmpParams) const = 0;
67  MiscLib::Vector<std::pair<float, float>>* bmpParams) const = 0;
68  virtual void BitmapExtent(float epsilon,
70  MiscLib::Vector<std::pair<float, float>>* params,
71  size_t* uextent,
72  size_t* vextent) = 0;
73  virtual void InBitmap(const std::pair<float, float>& param,
74  float epsilon,
76  size_t uextent,
77  size_t vextent,
78  std::pair<int, int>* inBmp) const = 0;
79  virtual void PreWrapBitmap(const GfxTL::AABox<GfxTL::Vector2Df>& bbox,
80  float epsilon,
81  size_t uextent,
82  size_t vextent,
83  MiscLib::Vector<char>* bmp) const;
84  virtual void WrapBitmap(const GfxTL::AABox<GfxTL::Vector2Df>& bbox,
85  float epsilon,
86  bool* uwrap,
87  bool* vwrap) const = 0;
88  virtual void WrapComponents(const GfxTL::AABox<GfxTL::Vector2Df>& bbox,
89  float epsilon,
90  size_t uextent,
91  size_t vextent,
92  MiscLib::Vector<int>* componentImg,
93  MiscLib::Vector<std::pair<int, size_t>>* labels) const;
94  virtual bool InSpace(size_t u,
95  size_t v,
96  float epsilon,
98  size_t uextent,
99  size_t vextent,
100  Vec3f* p,
101  Vec3f* n) const = 0;
102  template <class IteratorT>
103  void BuildBitmap(const PointCloud& pc,
104  float* epsilon,
105  IteratorT begin,
106  IteratorT end,
107  MiscLib::Vector<std::pair<float, float>>* params,
109  MiscLib::Vector<char>* bitmap,
110  size_t* uextent,
111  size_t* vextent,
112  MiscLib::Vector<size_t>* bmpIdx) const;
113  template <class IteratorT>
114  void BuildBitmap(const PointCloud& pc,
115  float* epsilon,
116  IteratorT begin,
117  IteratorT end,
118  MiscLib::Vector<std::pair<float, float>>* params,
120  MiscLib::Vector<char>* bitmap,
121  size_t* uextent,
122  size_t* vextent,
123  MiscLib::Vector<size_t>* bmpIdx,
124  size_t border) const;
125  void BuildPolygons(const PointCloud& pc,
126  float epsilon,
127  size_t begin,
128  size_t end,
130  size_t* uextent,
131  size_t* vextent,
132  std::deque<ComponentPolygons>* polys) const;
133 
134 protected:
136 };
137 
138 template <class IteratorT>
139 void
141  float* epsilon,
142  IteratorT begin,
143  IteratorT end,
144  MiscLib::Vector<std::pair<float, float>>* params,
146  MiscLib::Vector<char>* bitmap,
147  size_t* uextent,
148  size_t* vextent,
149  MiscLib::Vector<size_t>* bmpIdx) const
150 {
151  int size = end - begin;
152  params->resize(size);
153  // compute parameters and extent
154  Parameters(
155  GfxTL::IndexIterate(begin, pc.begin()), GfxTL::IndexIterate(end, pc.begin()), params);
156  bbox->Min() = GfxTL::Vector2Df(std::numeric_limits<float>::infinity(),
157  std::numeric_limits<float>::infinity());
158  bbox->Max() = -bbox->Min();
159  for (size_t i = 0; i < (size_t)size; ++i)
160  {
161  if ((*params)[i].first < bbox->Min()[0])
162  {
163  bbox->Min()[0] = (*params)[i].first;
164  }
165  if ((*params)[i].first > bbox->Max()[0])
166  {
167  bbox->Max()[0] = (*params)[i].first;
168  }
169  if ((*params)[i].second < bbox->Min()[1])
170  {
171  bbox->Min()[1] = (*params)[i].second;
172  }
173  if ((*params)[i].second > bbox->Max()[1])
174  {
175  bbox->Max()[1] = (*params)[i].second;
176  }
177  }
178  // bbox gives the bounding box in parameter space
179  // we can now set up the bitmap
180  const_cast<BitmapPrimitiveShape*>(this)->BitmapExtent(*epsilon, bbox, params, uextent, vextent);
181  if (*uextent < 2)
182  {
183  *uextent = 2;
184  }
185  if (*vextent < 2)
186  {
187  *vextent = 2;
188  }
189  bitmap->resize((*uextent) * (*vextent));
190  std::fill(bitmap->begin(), bitmap->end(), false);
191  // set all true bits in bitmap
192  bmpIdx->resize(params->size());
193  //#pragma omp parallel for schedule(static)
194  for (int i = 0; i < size; ++i)
195  {
196  std::pair<int, int> bmpParam;
197  InBitmap((*params)[i], *epsilon, *bbox, *uextent, *vextent, &bmpParam);
198  // clamp bitmap coords
199  bmpParam.first = GfxTL::Math<int>::Clamp(bmpParam.first, 0, *uextent - 1);
200  bmpParam.second = GfxTL::Math<int>::Clamp(bmpParam.second, 0, *vextent - 1);
201  (*bitmap)[(*bmpIdx)[i] = bmpParam.first + bmpParam.second * (*uextent)] = true;
202  }
203 }
204 
205 template <class IteratorT>
206 void
208  float* epsilon,
209  IteratorT begin,
210  IteratorT end,
211  MiscLib::Vector<std::pair<float, float>>* params,
213  MiscLib::Vector<char>* bitmap,
214  size_t* uextent,
215  size_t* vextent,
216  MiscLib::Vector<size_t>* bmpIdx,
217  size_t border) const
218 {
219  params->resize(end - begin);
220  // compute parameters and extent
221  Parameters(pc[*begin].pos, &(*params)[0]);
222  bbox->Min() = bbox->Max() = GfxTL::Vector2Df((*params)[0].first, (*params)[0].second);
223  size_t j = 1;
224  IteratorT i = begin;
225  for (++i; i != end; ++i, ++j)
226  {
227  Parameters(pc[*i].pos, &(*params)[j]);
228  if (bbox->Min()[0] > (*params)[j].first)
229  {
230  bbox->Min()[0] = (*params)[j].first;
231  }
232  else if (bbox->Max()[0] < (*params)[j].first)
233  {
234  bbox->Max()[0] = (*params)[j].first;
235  }
236  if (bbox->Min()[1] > (*params)[j].second)
237  {
238  bbox->Min()[1] = (*params)[j].second;
239  }
240  else if (bbox->Max()[1] < (*params)[j].second)
241  {
242  bbox->Max()[1] = (*params)[j].second;
243  }
244  }
245  // bbox gives the bounding box in parameter space
246  // we can now set up the bitmap
247  const_cast<BitmapPrimitiveShape*>(this)->BitmapExtent(*epsilon, bbox, params, uextent, vextent);
248  if (*uextent < 2)
249  {
250  *uextent = 2;
251  }
252  if (*vextent < 2)
253  {
254  *vextent = 2;
255  }
256  bitmap->resize(((*uextent) + 2 * border) * ((*vextent) + 2 * border));
257  std::fill(bitmap->begin(), bitmap->end(), false);
258  // set all true bits in bitmap
259  bmpIdx->resize(params->size());
260  size_t lineWidth = (*uextent) + 2 * border;
261  for (size_t i = 0; i < params->size(); ++i)
262  {
263  std::pair<int, int> bmpParam;
264  InBitmap((*params)[i], *epsilon, *bbox, *uextent, *vextent, &bmpParam);
265  // clamp bitmap coords
266  bmpParam.first = GfxTL::Math<int>::Clamp(bmpParam.first, 0, *uextent - 1);
267  bmpParam.second = GfxTL::Math<int>::Clamp(bmpParam.second, 0, *vextent - 1);
268  (*bitmap)[(*bmpIdx)[i] = bmpParam.first + border + (bmpParam.second + border) * lineWidth] =
269  true;
270  }
271 }
272 
273 #endif
GfxTL::IndexedIterator
Definition: IndexedIterator.h:8
GfxTL::AABox::Max
Point & Max()
Definition: AABox.hpp:82
MiscLib::Vector::begin
T * begin()
Definition: Vector.h:472
Vector.h
BitmapInfo::params
MiscLib::Vector< std::pair< float, float > > params
Definition: BitmapPrimitiveShape.h:24
Vec3f
Definition: basic.h:17
Performance.h
MiscLib::Vector::resize
void resize(size_type s, const value_type &v)
Definition: Vector.h:227
PrimitiveShape::ConnectedComponent
virtual size_t ConnectedComponent(const PointCloud &pc, float epsilon, MiscLib::Vector< size_t > *indices, bool doFiltering=true, float *borderRatio=0)=0
BitmapPrimitiveShape
Definition: BitmapPrimitiveShape.h:31
PrimitiveShape::TrimmingPolygons
virtual void TrimmingPolygons(const PointCloud &pc, float epsilon, size_t begin, size_t end, std::deque< ComponentPolygons > *polys) const =0
PrimitiveShape::Parameters
virtual void Parameters(const Vec3f &p, std::pair< float, float > *param) const =0
BitmapInfo::bmpIdx
MiscLib::Vector< size_t > bmpIdx
Definition: BitmapPrimitiveShape.h:27
magic_enum::detail::n
constexpr auto n() noexcept
Definition: magic_enum.hpp:418
BasePrimitiveShape
Definition: BasePrimitiveShape.h:12
BitmapInfo::bbox
GfxTL::AABox< GfxTL::Vector2Df > bbox
Definition: BitmapPrimitiveShape.h:26
MiscLib::Vector
Definition: Vector.h:19
MiscLib::Vector< Point >::const_iterator
const typedef Point * const_iterator
Definition: Vector.h:25
BitmapInfo
Definition: BitmapPrimitiveShape.h:22
PrimitiveShape::InSpace
virtual bool InSpace(float u, float v, Vec3f *p, Vec3f *n) const =0
pcl::graph::indices
pcl::PointIndices::Ptr indices(const PCG &g)
Retrieve the indices of the points of the point cloud stored in a point cloud graph that actually bel...
Definition: point_cloud_graph.h:717
IndexIterator.h
AABox.h
GfxTL::IndexIterate
IndexedIterator< IndexIteratorT, IteratorT > IndexIterate(IndexIteratorT idxIt, IteratorT it)
Definition: IndexedIterator.h:173
MiscLib::Vector::end
T * end()
Definition: Vector.h:484
BitmapPrimitiveShape::m_extBbox
GfxTL::AABox< GfxTL::Vector2Df > m_extBbox
Definition: BitmapPrimitiveShape.h:135
GfxTL::Math::Clamp
static ScalarT Clamp(ScalarT s, ScalarT bottom, ScalarT top)
Definition: MathHelper.h:39
IndexedIterator.h
PrimitiveShape::GenerateBitmapPoints
virtual void GenerateBitmapPoints(const PointCloud &pc, float epsilon, size_t begin, size_t end, PointCloud *bmpPc) const =0
Pair.h
PointCloud
Definition: PointCloud.h:85
BasePrimitiveShape.h
armarx::ctrlutil::v
double v(double t, double v0, double a0, double j)
Definition: CtrlUtil.h:39
BitmapInfo::vextent
size_t vextent
Definition: BitmapPrimitiveShape.h:28
GfxTL::AABox::Min
Point & Min()
Definition: AABox.hpp:68
BitmapPrimitiveShape::Parameters
virtual void Parameters(const Vec3f &p, std::pair< float, float > *param) const =0
DLL_LINKAGE
#define DLL_LINKAGE
Definition: basic.h:12
GfxTL::Vector2Df
VectorXD< 2, float > Vector2Df
Definition: VectorXD.h:716
BitmapPrimitiveShape::InBitmap
virtual void InBitmap(const std::pair< float, float > &param, float epsilon, const GfxTL::AABox< GfxTL::Vector2Df > &bbox, size_t uextent, size_t vextent, std::pair< int, int > *inBmp) const =0
BitmapInfo::bitmap
MiscLib::Vector< char > bitmap
Definition: BitmapPrimitiveShape.h:25
pc
Introduction Thank you for taking interest in our work and downloading this software This library implements the algorithm described in the paper R R R Klein Efficient RANSAC for Point Cloud Shape in Computer Graphics Blackwell June If you use this software you should cite the aforementioned paper in any resulting publication Please send comments or bug reports to Ruwen Roland BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY OR CONSEQUENTIAL WHETHER IN STRICT OR EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE Example usage This section shows how to use the library to detect the shapes in a point cloud PointCloud pc
Definition: ReadMe.txt:68
MathHelper.h
BitmapPrimitiveShape::BuildBitmap
void BuildBitmap(const PointCloud &pc, float *epsilon, IteratorT begin, IteratorT end, MiscLib::Vector< std::pair< float, float >> *params, GfxTL::AABox< GfxTL::Vector2Df > *bbox, MiscLib::Vector< char > *bitmap, size_t *uextent, size_t *vextent, MiscLib::Vector< size_t > *bmpIdx) const
Definition: BitmapPrimitiveShape.h:140
BitmapPrimitiveShape::BitmapExtent
virtual void BitmapExtent(float epsilon, GfxTL::AABox< GfxTL::Vector2Df > *bbox, MiscLib::Vector< std::pair< float, float >> *params, size_t *uextent, size_t *vextent)=0
BitmapInfo::uextent
size_t uextent
Definition: BitmapPrimitiveShape.h:28
GfxTL::AABox
Definition: AABox.h:19