Point Cloud Library (PCL)
1.15.1
Toggle main menu visibility
Loading...
Searching...
No Matches
pcl
surface
impl
marching_cubes_rbf.hpp
1
/*
2
* Software License Agreement (BSD License)
3
*
4
* Point Cloud Library (PCL) - www.pointclouds.org
5
* Copyright (c) 2010, Willow Garage, Inc.
6
* Copyright (c) 2012-, Open Perception, Inc.
7
*
8
* All rights reserved.
9
*
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
12
* are met:
13
*
14
* * Redistributions of source code must retain the above copyright
15
* notice, this list of conditions and the following disclaimer.
16
* * Redistributions in binary form must reproduce the above
17
* copyright notice, this list of conditions and the following
18
* disclaimer in the documentation and/or other materials provided
19
* with the distribution.
20
* * Neither the name of the copyright holder(s) nor the names of its
21
* contributors may be used to endorse or promote products derived
22
* from this software without specific prior written permission.
23
*
24
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
* POSSIBILITY OF SUCH DAMAGE.
36
*
37
*/
38
39
#ifndef PCL_SURFACE_IMPL_MARCHING_CUBES_RBF_H_
40
#define PCL_SURFACE_IMPL_MARCHING_CUBES_RBF_H_
41
42
#include <pcl/surface/marching_cubes_rbf.h>
43
44
//////////////////////////////////////////////////////////////////////////////////////////////
45
template
<
typename
Po
int
NT>
46
pcl::MarchingCubesRBF<PointNT>::~MarchingCubesRBF
() =
default
;
47
48
//////////////////////////////////////////////////////////////////////////////////////////////
49
template
<
typename
Po
int
NT>
void
50
pcl::MarchingCubesRBF<PointNT>::voxelizeData
()
51
{
52
// Initialize data structures
53
const
auto
N =
static_cast<
unsigned
int
>
(
input_
->size ());
54
Eigen::MatrixXd M (2*N, 2*N),
55
d (2*N, 1);
56
57
for
(
unsigned
int
row_i = 0; row_i < 2*N; ++row_i)
58
{
59
// boolean variable to determine whether we are in the off_surface domain for the rows
60
bool
row_off = (row_i >= N);
61
for
(
unsigned
int
col_i = 0; col_i < 2*N; ++col_i)
62
{
63
// boolean variable to determine whether we are in the off_surface domain for the columns
64
bool
col_off = (col_i >= N);
65
M (row_i, col_i) =
kernel
(Eigen::Vector3f ((*
input_
)[col_i%N].getVector3fMap ()).cast<double> () + Eigen::Vector3f ((*
input_
)[col_i%N].getNormalVector3fMap ()).cast<double> () * col_off *
off_surface_epsilon_
,
66
Eigen::Vector3f ((*
input_
)[row_i%N].getVector3fMap ()).cast<double> () + Eigen::Vector3f ((*
input_
)[row_i%N].getNormalVector3fMap ()).cast<double> () * row_off *
off_surface_epsilon_
);
67
}
68
69
d (row_i, 0) = row_off *
off_surface_epsilon_
;
70
}
71
72
// Solve for the weights
73
Eigen::MatrixXd w (2*N, 1);
74
75
// Solve_linear_system (M, d, w);
76
w = M.fullPivLu ().solve (d);
77
78
std::vector<double> weights (2*N);
79
std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d> > centers (2*N);
80
for
(
unsigned
int
i = 0; i < N; ++i)
81
{
82
centers[i] = Eigen::Vector3f ((*
input_
)[i].getVector3fMap ()).cast<
double
> ();
83
centers[i + N] = Eigen::Vector3f ((*
input_
)[i].getVector3fMap ()).cast<
double
> () + Eigen::Vector3f ((*
input_
)[i].getNormalVector3fMap ()).cast<
double
> () *
off_surface_epsilon_
;
84
weights[i] = w (i, 0);
85
weights[i + N] = w (i + N, 0);
86
}
87
88
for
(
int
x = 0; x <
res_x_
; ++x)
89
for
(
int
y = 0; y <
res_y_
; ++y)
90
for
(
int
z = 0; z <
res_z_
; ++z)
91
{
92
const
Eigen::Vector3f point_f = (
size_voxel_
* Eigen::Array3f (x, y, z)
93
+
lower_boundary_
).matrix ();
94
const
Eigen::Vector3d point = point_f.cast<
double
> ();
95
96
double
f = 0.0;
97
auto
w_it (weights.cbegin());
98
for
(
auto
c_it = centers.cbegin ();
99
c_it != centers.cend (); ++c_it, ++w_it)
100
f += *w_it *
kernel
(*c_it, point);
101
102
grid_
[x *
res_y_
*
res_z_
+ y *
res_z_
+ z] =
static_cast<
float
>
(f);
103
}
104
}
105
106
//////////////////////////////////////////////////////////////////////////////////////////////
107
template
<
typename
Po
int
NT>
double
108
pcl::MarchingCubesRBF<PointNT>::kernel
(Eigen::Vector3d c, Eigen::Vector3d x)
109
{
110
double
r = (x - c).norm ();
111
return
(r * r * r);
112
}
113
114
#define PCL_INSTANTIATE_MarchingCubesRBF(T) template class PCL_EXPORTS pcl::MarchingCubesRBF<T>;
115
116
#endif
// PCL_SURFACE_IMPL_MARCHING_CUBES_HOPPE_H_
117
pcl::MarchingCubes::grid_
std::vector< float > grid_
The data structure storing the 3D grid.
Definition
marching_cubes.h:439
pcl::MarchingCubes::res_x_
int res_x_
The grid resolution.
Definition
marching_cubes.h:442
pcl::MarchingCubes::size_voxel_
Eigen::Array3f size_voxel_
size of voxels
Definition
marching_cubes.h:449
pcl::MarchingCubes::res_y_
int res_y_
Definition
marching_cubes.h:442
pcl::MarchingCubes::res_z_
int res_z_
Definition
marching_cubes.h:442
pcl::MarchingCubes::lower_boundary_
Eigen::Array3f lower_boundary_
Definition
marching_cubes.h:446
pcl::MarchingCubesRBF::off_surface_epsilon_
float off_surface_epsilon_
The off-surface displacement value.
Definition
marching_cubes_rbf.h:116
pcl::MarchingCubesRBF::voxelizeData
void voxelizeData() override
Convert the point cloud into voxel data.
Definition
marching_cubes_rbf.hpp:50
pcl::MarchingCubesRBF::kernel
double kernel(Eigen::Vector3d c, Eigen::Vector3d x)
the Radial Basis Function kernel.
Definition
marching_cubes_rbf.hpp:108
pcl::MarchingCubesRBF::~MarchingCubesRBF
~MarchingCubesRBF() override
Destructor.
pcl::PCLBase< PointNT >::input_
PointCloudConstPtr input_
Definition
pcl_base.h:147