InitialAlignment.h
Go to the documentation of this file.
1 
19 #pragma once
20 #ifndef _INITIAL_ALIGNMENT_H
21 #define _INITIAL_ALIGNMENT_H
22 
23 #include <Utils.h>
24 
43 namespace AlignmentMethods
44 {
50  {
56  };
57 }
59 
61 {
62  typedef pcl::PointCloud<pcl::PointXYZ> PointCloudXYZ;
63  typedef pcl::PointCloud<pcl::PointXYZRGB> PointCloudRGB;
64  typedef pcl::PointCloud<pcl::Normal> PointCloudNormal;
65  typedef pcl::PointCloud<pcl::FPFHSignature33> PointCloudFPFH;
66 
67 public:
74  InitialAlignment(PointCloudRGB::Ptr target_cloud, PointCloudRGB::Ptr source_cloud);
75 
81 
83  bool transform_exists_;
84 
89  void run();
90 
96  Eigen::Matrix4f getRigidTransform();
97 
103  void getAlignedCloud(PointCloudRGB::Ptr aligned_cloud);
104 
110  void getAlignedCloudROSMsg(sensor_msgs::PointCloud2& aligned_cloud_msg);
111 
117  void applyTFtoCloud(PointCloudRGB::Ptr cloud);
118 
125  void applyTFtoCloud(PointCloudRGB::Ptr cloud, Eigen::Matrix4f tf);
126 
132  void setMethod(AlignmentMethod method);
133 
139  void setRadiusFactor(double align_factor);
140 
141 private:
143  Eigen::Matrix4f rigid_tf_;
144 
147 
150 
152  PointCloudRGB::Ptr target_cloud_;
153 
155  PointCloudRGB::Ptr source_cloud_;
156 
158  PointCloudRGB::Ptr aligned_cloud_;
159 
161  PointCloudNormal::Ptr source_normals_;
162 
164  PointCloudNormal::Ptr target_normals_;
165 
167  PointCloudNormal::Ptr source_dominant_normals_;
168 
170  PointCloudNormal::Ptr target_dominant_normals_;
171 
173  PointCloudRGB::Ptr target_keypoints_;
174 
176  PointCloudRGB::Ptr source_keypoints_;
177 
179  PointCloudFPFH::Ptr target_features_;
180 
182  PointCloudFPFH::Ptr source_features_;
183 
185  pcl::CorrespondencesPtr correspondences_;
186 
189 
191  Eigen::Vector4f source_centroid_;
192 
194  Eigen::Vector4f target_centroid_;
195 
200  void applyTFtoCloud();
201 
206  void runNormalsBasedAlgorithm();
207 
212  void runKeypointsBasedAlgorithm();
213 
221  void obtainNormalsCluster(PointCloudRGB::Ptr cloud,
222  PointCloudNormal::Ptr normals,
223  std::vector<pcl::PointIndices>& cluster_indices);
224 
232  void obtainDominantNormals(PointCloudNormal::Ptr normals,
233  std::vector<pcl::PointIndices> cluster_indices,
234  PointCloudNormal::Ptr dominant_normals);
235 
246  bool normalsCorrespondences(PointCloudNormal::Ptr source_dominant_normal,
247  PointCloudNormal::Ptr target_dominant_normal,
248  std::vector<int>& source_idx, std::vector<int>& target_idx);
249 
256  void getTransformationFromNormals(PointCloudNormal::Ptr source_normals,
257  PointCloudNormal::Ptr target_normals);
258 
271  bool findIdx(Eigen::MatrixXd source_m, Eigen::MatrixXd target_m,
272  Eigen::MatrixXi source_idx_m, Eigen::MatrixXi target_idx_m,
273  std::vector<int>& source_indx, std::vector<int>& target_indx);
274 
282  Eigen::Matrix3f getCoordinateSystem(PointCloudNormal::Ptr normals,
283  std::vector<int>& index);
284 
293  void matrixFromAngles(PointCloudNormal::Ptr normal,
294  size_t size,
295  Eigen::MatrixXd& matrix,
296  Eigen::MatrixXi& index_matrix);
297 
306  Eigen::VectorXd nextVector(Eigen::MatrixXd matrix,
307  int current_col, int current_row);
308 
318  int obtainHarrisKeypoints(PointCloudRGB::Ptr cloud,
319  PointCloudNormal::Ptr normals,
320  PointCloudRGB::Ptr keypoints_cloud,
321  pcl::IndicesPtr keypoints_indices);
322 
333  int obtainBoundaryKeypoints(PointCloudRGB::Ptr cloud,
334  PointCloudNormal::Ptr normals,
335  PointCloudRGB::Ptr keypoints_cloud,
336  pcl::IndicesPtr keypoints_indices,
337  pcl::IndicesPtr non_keypoints_indices);
338 
349  int obtainMultiScaleKeypointsAndFeatures(PointCloudRGB::Ptr cloud,
350  PointCloudNormal::Ptr normals,
351  PointCloudRGB::Ptr keypoints_cloud,
352  pcl::IndicesPtr keypoints_indices,
353  PointCloudFPFH::Ptr features);
354 
364  int obtainFeatures(PointCloudRGB::Ptr cloud,
365  PointCloudNormal::Ptr normals,
366  pcl::IndicesPtr keypoints_indices,
367  PointCloudFPFH::Ptr features);
368 
378  int obtainKeypointsAndFeatures(PointCloudRGB::Ptr cloud,
379  PointCloudNormal::Ptr normals,
380  PointCloudRGB::Ptr keypoints_cloud,
381  PointCloudFPFH::Ptr features_cloud);
382 
387  void obtainCorrespondences();
388 
393  void rejectCorrespondences();
394 
399  void rejectOneToOneCorrespondences();
400 
405  void estimateTransform();
406 };
407 
408 #endif
PointCloudNormal::Ptr target_normals_
Target normals.
Perform a rigid alignment from source to target cloud.
Eigen::Vector4f source_centroid_
Source centroid computed.
PointCloudNormal::Ptr target_dominant_normals_
Target dominant normals. Just used int NORMALS method.
PointCloudRGB::Ptr source_keypoints_
Source keypoints.
pcl::PointCloud< pcl::FPFHSignature33 > PointCloudFPFH
PointCloudFPFH::Ptr source_features_
Source features.
PointCloudRGB::Ptr aligned_cloud_
Source pointcloud aligned with target cloud.
pcl::CorrespondencesPtr correspondences_
Correspondences between source and target.
AlignmentMethod
Define possible Alignment methods.
Eigen::Vector4f target_centroid_
Target centroid computed.
~InitialAlignment()
Destroy the Initial Alignment object.
pcl::PointCloud< pcl::PointXYZRGB > PointCloudRGB
PointCloudRGB::Ptr target_keypoints_
Target keypoints.
AlignmentMethod method_
The alignment method.
PointCloudRGB::Ptr target_cloud_
Target pointcloud.
pcl::PointCloud< pcl::Normal > PointCloudNormal
double normal_radius_
Radius to compute normals.
PointCloudNormal::Ptr source_dominant_normals_
Source dominant normals. Just used int NORMALS method.
Eigen::Matrix4f rigid_tf_
Transformation matrix as result of initial alignment.
PointCloudFPFH::Ptr target_features_
Target features.
pcl::PointCloud< pcl::PointXYZ > PointCloudXYZ
PointCloudRGB::Ptr source_cloud_
Source pointcloud.
PointCloudNormal::Ptr source_normals_
Source normals.
double radius_factor_
Factor to apply to radius for computations.


leica_point_cloud_processing
Author(s): Ines Lara Sicilia
autogenerated on Fri Feb 5 2021 03:20:30