Point Cloud Library (PCL) 1.15.0
Loading...
Searching...
No Matches
correspondence_estimation_organized_projection.h
1/*
2 * Software License Agreement (BSD License)
3 *
4 * Point Cloud Library (PCL) - www.pointclouds.org
5 * Copyright (c) 2012-, Open Perception, Inc.
6 *
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * * Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * * Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials provided
18 * with the distribution.
19 * * Neither the name of the copyright holder(s) nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 *
36 * $Id$
37 *
38 */
39
40#pragma once
41
42#include <pcl/registration/correspondence_estimation.h>
43#include <pcl/memory.h>
44#include <pcl/pcl_macros.h>
45
46namespace pcl {
47namespace registration {
48/** \brief CorrespondenceEstimationOrganizedProjection computes correspondences by
49 * projecting the source point cloud onto the target point cloud using the camera
50 * intrinsic and extrinsic parameters. The correspondences can be trimmed by a depth
51 * threshold and by a distance threshold. It is not as precise as a nearest neighbor
52 * search, but it is much faster, as it avoids the usage of any additional structures
53 * (i.e., kd-trees). \note The target point cloud must be organized (no restrictions on
54 * the source) and the target point cloud must be given in the camera coordinate frame.
55 * Any other transformation is specified by the src_to_tgt_transformation_ variable.
56 * \author Alex Ichim
57 * \ingroup registration
58 */
59template <typename PointSource, typename PointTarget, typename Scalar = float>
61: public CorrespondenceEstimationBase<PointSource, PointTarget, Scalar> {
62public:
63 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::initCompute;
64 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::
65 input_transformed_;
66 using PCLBase<PointSource>::deinitCompute;
67 using PCLBase<PointSource>::input_;
68 using PCLBase<PointSource>::indices_;
69 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::getClassName;
70 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::
71 point_representation_;
72 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::
73 target_cloud_updated_;
74
78
82
83 using Ptr = shared_ptr<
85 using ConstPtr =
86 shared_ptr<const CorrespondenceEstimationOrganizedProjection<PointSource,
87 PointTarget,
88 Scalar>>;
89
90 /** \brief Empty constructor that sets all the intrinsic calibration to the default
91 * Kinect values. */
93 : src_to_tgt_transformation_(Eigen::Matrix4f::Identity())
94 , depth_threshold_(std::numeric_limits<float>::max())
95 , projection_matrix_(Eigen::Matrix3f::Identity())
96 {}
97
98 /** \brief Sets the focal length parameters of the target camera.
99 * \param[in] fx the focal length in pixels along the x-axis of the image
100 * \param[in] fy the focal length in pixels along the y-axis of the image
101 */
102 inline void
103 setFocalLengths(const float fx, const float fy)
104 {
105 fx_ = fx;
106 fy_ = fy;
107 }
108
109 /** \brief Reads back the focal length parameters of the target camera.
110 * \param[out] fx the focal length in pixels along the x-axis of the image
111 * \param[out] fy the focal length in pixels along the y-axis of the image
112 */
113 inline void
114 getFocalLengths(float& fx, float& fy) const
115 {
116 fx = fx_;
117 fy = fy_;
118 }
119
120 /** \brief Sets the camera center parameters of the target camera.
121 * \param[in] cx the x-coordinate of the camera center
122 * \param[in] cy the y-coordinate of the camera center
123 */
124 inline void
125 setCameraCenters(const float cx, const float cy)
126 {
127 cx_ = cx;
128 cy_ = cy;
129 }
130
131 /** \brief Reads back the camera center parameters of the target camera.
132 * \param[out] cx the x-coordinate of the camera center
133 * \param[out] cy the y-coordinate of the camera center
134 */
135 inline void
136 getCameraCenters(float& cx, float& cy) const
137 {
138 cx = cx_;
139 cy = cy_;
140 }
141
142 /** \brief Sets the transformation from the source point cloud to the target point
143 * cloud. \note The target point cloud must be in its local camera coordinates, so use
144 * this transformation to correct for that. \param[in] src_to_tgt_transformation the
145 * transformation
146 */
147 inline void
148 setSourceTransformation(const Eigen::Matrix4f& src_to_tgt_transformation)
149 {
150 src_to_tgt_transformation_ = src_to_tgt_transformation;
151 }
152
153 /** \brief Reads back the transformation from the source point cloud to the target
154 * point cloud. \note The target point cloud must be in its local camera coordinates,
155 * so use this transformation to correct for that. \return the transformation
156 */
157 inline Eigen::Matrix4f
159 {
161 }
162
163 /** \brief Sets the depth threshold; after projecting the source points in the image
164 * space of the target camera, this threshold is applied on the depths of
165 * corresponding dexels to eliminate the ones that are too far from each other.
166 * \param[in] depth_threshold the depth threshold
167 */
168 inline void
169 setDepthThreshold(const float depth_threshold)
170 {
171 depth_threshold_ = depth_threshold;
172 }
173
174 /** \brief Reads back the depth threshold; after projecting the source points in the
175 * image space of the target camera, this threshold is applied on the depths of
176 * corresponding dexels to eliminate the ones that are too far from each other.
177 * \return the depth threshold
178 */
179 inline float
181 {
182 return (depth_threshold_);
183 }
184
185 /** \brief Computes the correspondences, applying a maximum Euclidean distance
186 * threshold.
187 * \param[out] correspondences the found correspondences (index of query point, index
188 * of target point, distance)
189 * \param[in] max_distance Euclidean distance threshold above which correspondences
190 * will be rejected
191 */
192 void
193 determineCorrespondences(Correspondences& correspondences, double max_distance);
194
195 /** \brief Computes the correspondences, applying a maximum Euclidean distance
196 * threshold.
197 * \param[out] correspondences the found correspondences (index of query and target
198 * point, distance)
199 * \param[in] max_distance Euclidean distance threshold above which correspondences
200 * will be rejected
201 */
202 void
204 double max_distance);
205
206 /** \brief Clone and cast to CorrespondenceEstimationBase */
208 clone() const
209 {
211 PointTarget,
212 Scalar>(*this));
213 return (copy);
214 }
215
216protected:
217 using CorrespondenceEstimationBase<PointSource, PointTarget, Scalar>::target_;
218
219 bool
220 initCompute();
221
222 float fx_{525.f}, fy_{525.f};
223 float cx_{319.5f}, cy_{239.5f};
226
227 Eigen::Matrix3f projection_matrix_;
228
229public:
231};
232} // namespace registration
233} // namespace pcl
234
235#include <pcl/registration/impl/correspondence_estimation_organized_projection.hpp>
PointCloudConstPtr input_
Definition pcl_base.h:147
PointCloud represents the base class in PCL for storing collections of 3D points.
shared_ptr< PointCloud< PointSource > > Ptr
shared_ptr< const PointCloud< PointSource > > ConstPtr
Abstract CorrespondenceEstimationBase class.
shared_ptr< CorrespondenceEstimationBase< PointSource, PointTarget, Scalar > > Ptr
shared_ptr< const CorrespondenceEstimationOrganizedProjection< PointSource, PointTarget, Scalar > > ConstPtr
shared_ptr< CorrespondenceEstimationOrganizedProjection< PointSource, PointTarget, Scalar > > Ptr
void setFocalLengths(const float fx, const float fy)
Sets the focal length parameters of the target camera.
void determineCorrespondences(Correspondences &correspondences, double max_distance)
Computes the correspondences, applying a maximum Euclidean distance threshold.
void getCameraCenters(float &cx, float &cy) const
Reads back the camera center parameters of the target camera.
Eigen::Matrix4f getSourceTransformation() const
Reads back the transformation from the source point cloud to the target point cloud.
void setSourceTransformation(const Eigen::Matrix4f &src_to_tgt_transformation)
Sets the transformation from the source point cloud to the target point cloud.
CorrespondenceEstimationOrganizedProjection()
Empty constructor that sets all the intrinsic calibration to the default Kinect values.
float getDepthThreshold() const
Reads back the depth threshold; after projecting the source points in the image space of the target c...
void determineReciprocalCorrespondences(Correspondences &correspondences, double max_distance)
Computes the correspondences, applying a maximum Euclidean distance threshold.
void setCameraCenters(const float cx, const float cy)
Sets the camera center parameters of the target camera.
void getFocalLengths(float &fx, float &fy) const
Reads back the focal length parameters of the target camera.
void setDepthThreshold(const float depth_threshold)
Sets the depth threshold; after projecting the source points in the image space of the target camera,...
virtual CorrespondenceEstimationBase< PointSource, PointTarget, Scalar >::Ptr clone() const
Clone and cast to CorrespondenceEstimationBase.
#define PCL_MAKE_ALIGNED_OPERATOR_NEW
Macro to signal a class requires a custom allocator.
Definition memory.h:86
Defines functions, macros and traits for allocating and using memory.
Definition bfgs.h:10
std::vector< pcl::Correspondence, Eigen::aligned_allocator< pcl::Correspondence > > Correspondences
Defines all the PCL and non-PCL macros used.