PlanePrimitiveShape.cpp
Go to the documentation of this file.
1 #include "PlanePrimitiveShape.h"
2 
3 #include <fstream>
4 #include <iomanip>
5 #include <iostream>
6 #include <limits>
7 #include <sstream>
8 
10 #include "ScoreComputer.h"
11 #include <GfxTL/NullClass.h>
12 #include <MiscLib/Performance.h>
14 
16  m_plane(a, b, c)
17 {
18  m_hcs.FromNormal(m_plane.getNormal());
19 }
20 
21 PlanePrimitiveShape::PlanePrimitiveShape(const Plane& plane) : m_plane(plane)
22 {
23  m_hcs.FromNormal(m_plane.getNormal());
24 }
25 
26 size_t
28 {
29  return 0;
30 }
31 
34 {
35  return new PlanePrimitiveShape(*this);
36 }
37 
38 float
40 {
41  return m_plane.getDistance(p);
42 }
43 
44 float
46 {
47  return m_plane.SignedDistance(p);
48 }
49 
50 float
52 {
53  return m_plane.getNormal().dot(n);
54 }
55 
56 void
58  const Vec3f& n,
59  std::pair<float, float>* dn) const
60 {
61  dn->first = m_plane.getDistance(p);
62  dn->second = m_plane.getNormal().dot(n);
63 }
64 
65 void
67 {
68  *pp = p - ((m_plane.getNormal().dot(p - m_plane.getPosition())) * m_plane.getNormal());
69 }
70 
71 void
73 {
74  *n = m_plane.getNormal();
75 }
76 
77 unsigned int
79  float epsilon,
80  float normalThresh,
81  float rms,
82  const PointCloud& pc,
83  const MiscLib::Vector<size_t>& indices) const
84 {
85  return BasePrimitiveShape::ConfidenceTests<Plane>(
86  numTests, epsilon, normalThresh, rms, pc, indices);
87 }
88 
89 void
91 {
92  *s = "Plane";
93 }
94 
95 bool
97  float epsilon,
98  float normalThresh,
101 {
102  Plane fit = m_plane;
103  //if(fit.LeastSquaresFit(pc, begin, end))
104  if (fit.LeastSquaresFit(pc, begin, end))
105  {
106  m_plane = fit;
107  m_hcs.FromNormal(m_plane.getNormal());
108  return true;
109  }
110  return false;
111 }
112 
115  float epsilon,
116  float normalThresh,
119  std::pair<size_t, float>* score) const
120 {
121  Plane fit = m_plane;
122  if (fit.LeastSquaresFit(pc, begin, end))
123  {
124  score->first = -1;
125  return new PlanePrimitiveShape(fit);
126  }
127  score->first = 0;
128  return NULL;
129 }
130 
131 void
132 PlanePrimitiveShape::Serialize(std::ostream* o, bool binary) const
133 {
134  if (binary)
135  {
136  const char id = 0;
137  (*o) << id;
138  }
139  else
140  {
141  (*o) << "0"
142  << " ";
143  }
144  m_plane.Serialize(binary, o);
145  if (!binary)
146  {
147  *o << std::endl;
148  }
149 }
150 
151 size_t
153 {
154  return m_plane.SerializedSize() + 1;
155 }
156 
157 void
158 PlanePrimitiveShape::Transform(float scale, const Vec3f& translate)
159 {
160  m_plane.Transform(scale, translate);
161 }
162 
163 void
165  const GfxTL::Vector3Df& trans)
166 {
167  GfxTL::Vector3Df transNormal = rot * GfxTL::Vector3Df(m_plane.getNormal());
168  GfxTL::Vector3Df transOrigin = rot * GfxTL::Vector3Df(m_plane.getPosition()) + trans;
169  m_plane = Plane(Vec3f(transOrigin.Data()), Vec3f(transNormal.Data()));
170  m_hcs[0] = rot * m_hcs[0];
171  m_hcs[1] = rot * m_hcs[1];
172 }
173 
174 void
176 {
177  visitor->Visit(*this);
178 }
179 
180 bool
182 {
183  return true; // planes are always similar!
184 }
185 
188 {
189  return new PlaneLevMarFunc(m_plane);
190 }
191 
192 void
193 PlanePrimitiveShape::Parameters(const Vec3f& p, std::pair<float, float>* param) const
194 {
195  Vec3f pp = p - m_plane.getPosition();
196  param->first = pp.dot(m_hcs[0].Data());
197  param->second = pp.dot(m_hcs[1].Data());
198 }
199 
200 void
204  MiscLib::Vector<std::pair<float, float>>* bmpParams) const
205 {
206  ParametersImpl(begin, end, bmpParams);
207 }
208 
209 void
213  MiscLib::Vector<std::pair<float, float>>* bmpParams) const
214 {
215  ParametersImpl(begin, end, bmpParams);
216 }
217 
218 void
221  MiscLib::Vector<std::pair<float, float>>* params,
222  size_t* uextent,
223  size_t* vextent)
224 {
225  *uextent = size_t(std::ceil((bbox->Max()[0] - bbox->Min()[0]) / epsilon)) + 1;
226  *vextent = size_t(std::ceil((bbox->Max()[1] - bbox->Min()[1]) / epsilon)) + 1;
227 }
228 
229 void
230 PlanePrimitiveShape::InBitmap(const std::pair<float, float>& param,
231  float epsilon,
232  const GfxTL::AABox<GfxTL::Vector2Df>& bbox,
233  size_t,
234  size_t,
235  std::pair<int, int>* inBmp) const
236 {
237  inBmp->first = std::floor((param.first - bbox.Min()[0]) / epsilon);
238  inBmp->second = std::floor((param.second - bbox.Min()[1]) / epsilon);
239 }
240 
241 void
243  float epsilon,
244  bool* uwrap,
245  bool* vwrap) const
246 {
247  *uwrap = false;
248  *vwrap = false;
249 }
250 
251 void
253  const MiscLib::Vector<int>&,
254  size_t,
255  size_t,
256  float,
257  int)
258 {
259 }
260 
261 bool
262 PlanePrimitiveShape::InSpace(float u, float v, Vec3f* p, Vec3f* n) const
263 {
264  *p = m_plane.getPosition() + Vec3f((u * m_hcs[0] + v * m_hcs[1]).Data());
265  *n = m_plane.getNormal();
266  return true;
267 }
268 
269 bool
271  size_t v,
272  float epsilon,
273  const GfxTL::AABox<GfxTL::Vector2Df>& bbox,
274  size_t uextent,
275  size_t vextent,
276  Vec3f* p,
277  Vec3f* n) const
278 {
279  *p = Vec3f(((bbox.Min()[0] + epsilon * (float(u) + .5f)) * m_hcs[0] +
280  (bbox.Min()[1] + epsilon * (float(v) + .5f)) * m_hcs[1])
281  .Data()) +
282  m_plane.getPosition();
283  *n = m_plane.getNormal();
284  return true;
285 }
GfxTL::IndexedIterator
Definition: IndexedIterator.h:8
PlaneLevMarFunc
Definition: PlanePrimitiveShape.h:147
PrimitiveShapeVisitor::Visit
virtual void Visit(const PlanePrimitiveShape &plane)=0
LevMarFunc< float >
GfxTL::VectorXD
Definition: MatrixXX.h:24
PlanePrimitiveShape::Clone
PrimitiveShape * Clone() const
Definition: PlanePrimitiveShape.cpp:33
PlanePrimitiveShape::Description
void Description(std::string *s) const
Definition: PlanePrimitiveShape.cpp:90
GfxTL::AABox::Max
Point & Max()
Definition: AABox.hpp:82
totalTime_planeConnected
MiscLib::performance_t totalTime_planeConnected
GfxTL::Vec3f
VectorXD< 3, float > Vec3f
Definition: VectorXD.h:733
PlanePrimitiveShape::Distance
float Distance(const Vec3f &p) const
Definition: PlanePrimitiveShape.cpp:39
PlanePrimitiveShape::NormalDeviation
float NormalDeviation(const Vec3f &p, const Vec3f &n) const
Definition: PlanePrimitiveShape.cpp:51
PlanePrimitiveShape.h
PlanePrimitiveShape::WrapBitmap
void WrapBitmap(const GfxTL::AABox< GfxTL::Vector2Df > &bbox, float epsilon, bool *uwrap, bool *vwrap) const
Definition: PlanePrimitiveShape.cpp:242
Vec3f
Definition: basic.h:17
Performance.h
PlanePrimitiveShape::DistanceAndNormalDeviation
void DistanceAndNormalDeviation(const Vec3f &p, const Vec3f &n, std::pair< float, float > *dn) const
Definition: PlanePrimitiveShape.cpp:57
PlanePrimitiveShape::Normal
void Normal(const Vec3f &p, Vec3f *n) const
Definition: PlanePrimitiveShape.cpp:72
PlanePrimitiveShape::Fit
bool Fit(const PointCloud &pc, float epsilon, float normalThresh, MiscLib::Vector< size_t >::const_iterator begin, MiscLib::Vector< size_t >::const_iterator end)
Definition: PlanePrimitiveShape.cpp:96
Plane::LeastSquaresFit
bool LeastSquaresFit(const PointCloud &pc, MiscLib::Vector< size_t >::const_iterator begin, MiscLib::Vector< size_t >::const_iterator end)
Definition: Plane.cpp:200
PlanePrimitiveShape::Project
void Project(const Vec3f &p, Vec3f *pp) const
Definition: PlanePrimitiveShape.cpp:66
PlanePrimitiveShape::ConfidenceTests
unsigned int ConfidenceTests(unsigned int numTests, float epsilon, float normalThresh, float rms, const PointCloud &pc, const MiscLib::Vector< size_t > &indices) const
Definition: PlanePrimitiveShape.cpp:78
Plane::Transform
void Transform(float scale, const Vec3f &translate)
Definition: Plane.cpp:290
GfxTL::Vector3Df
VectorXD< 3, float > Vector3Df
Definition: VectorXD.h:718
PrimitiveShape
PrimtiveShape is a shape primitive in conjunction with a parametrization.
Definition: PrimitiveShape.h:34
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
PlanePrimitiveShape::BitmapExtent
void BitmapExtent(float epsilon, GfxTL::AABox< GfxTL::Vector2Df > *bbox, MiscLib::Vector< std::pair< float, float >> *params, size_t *uextent, size_t *vextent)
Definition: PlanePrimitiveShape.cpp:219
PlanePrimitiveShape::Serialize
void Serialize(std::ostream *o, bool binary=true) const
This is the one and only serialization function It stores all the parameters of the shape as well as ...
Definition: PlanePrimitiveShape.cpp:132
GfxTL::MatrixXX
Definition: MatrixXX.h:28
magic_enum::detail::n
constexpr auto n() noexcept
Definition: magic_enum.hpp:418
MiscLib::Vector< size_t >
PlanePrimitiveShape::SetExtent
void SetExtent(const GfxTL::AABox< GfxTL::Vector2Df > &bbox, const MiscLib::Vector< int > &componentsImg, size_t uextent, size_t vextent, float epsilon, int label)
Definition: PlanePrimitiveShape.cpp:252
PrimitiveShapeVisitor.h
PlanePrimitiveShape::InBitmap
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
Definition: PlanePrimitiveShape.cpp:230
Plane::SerializedSize
static size_t SerializedSize()
Definition: Plane.cpp:259
MiscLib::Vector< Point >::const_iterator
const typedef Point * const_iterator
Definition: Vector.h:25
PlanePrimitiveShape::SignedDistanceFunc
LevMarFunc< float > * SignedDistanceFunc() const
Definition: PlanePrimitiveShape.cpp:187
PlanePrimitiveShape::SerializedSize
size_t SerializedSize() const
Definition: PlanePrimitiveShape.cpp:152
Plane::getPosition
const Vec3f & getPosition() const
Definition: Plane.h:78
armarx::ctrlutil::a
double a(double t, double a0, double j)
Definition: CtrlUtil.h:45
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
PlanePrimitiveShape::Transform
void Transform(float scale, const Vec3f &translate)
Definition: PlanePrimitiveShape.cpp:158
PlanePrimitiveShape
Definition: PlanePrimitiveShape.h:15
PrimitiveShapeVisitor
Definition: PrimitiveShapeVisitor.h:14
MiscLib::performance_t
clock_t performance_t
Definition: Performance.h:31
PlanePrimitiveShape::PlanePrimitiveShape
PlanePrimitiveShape(const Vec3f &a, const Vec3f &b, const Vec3f &c)
Definition: PlanePrimitiveShape.cpp:15
PlanePrimitiveShape::LSFit
PrimitiveShape * LSFit(const PointCloud &pc, float epsilon, float normalThresh, MiscLib::Vector< size_t >::const_iterator begin, MiscLib::Vector< size_t >::const_iterator end, std::pair< size_t, float > *score) const
Definition: PlanePrimitiveShape.cpp:114
PlanePrimitiveShape::Identifier
size_t Identifier() const
Definition: PlanePrimitiveShape.cpp:27
PointCloud
Definition: PointCloud.h:85
armarx::ctrlutil::v
double v(double t, double v0, double a0, double j)
Definition: CtrlUtil.h:39
Vec3f::dot
float dot(const Vec3f &v) const
Definition: basic.h:104
Plane::SignedDistance
float SignedDistance(const Vec3f &pos) const
Definition: Plane.h:53
Plane::getNormal
const Vec3f & getNormal() const
Definition: Plane.h:72
Plane::Serialize
void Serialize(bool binary, std::ostream *o) const
Definition: Plane.cpp:226
GfxTL::AABox::Min
Point & Min()
Definition: AABox.hpp:68
PlanePrimitiveShape::Similar
bool Similar(float tolerance, const PlanePrimitiveShape &) const
Definition: PlanePrimitiveShape.cpp:181
NullClass.h
Plane
Definition: Plane.h:18
ScoreComputer.h
PlanePrimitiveShape::SignedDistance
float SignedDistance(const Vec3f &p) const
Definition: PlanePrimitiveShape.cpp:45
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
PlanePrimitiveShape::InSpace
bool InSpace(float u, float v, Vec3f *p, Vec3f *n) const
Definition: PlanePrimitiveShape.cpp:262
PlanePrimitiveShape::Parameters
void Parameters(const Vec3f &p, std::pair< float, float > *param) const
Definition: PlanePrimitiveShape.cpp:193
PlanePrimitiveShape::Visit
void Visit(PrimitiveShapeVisitor *visitor) const
Definition: PlanePrimitiveShape.cpp:175
Plane::getDistance
float getDistance(const Vec3f &pos) const
Definition: Plane.h:41
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
GfxTL::AABox
Definition: AABox.h:19