From f7eecde8614dd3646a322a2e3d0ad74f6bace8d0 Mon Sep 17 00:00:00 2001 From: muehlenb <muehlenb@uni-bremen.de> Date: Mon, 8 Feb 2021 11:38:38 +0100 Subject: [PATCH] Changed API a bit for registration of multiple kinects via Grid. --- .../Private/GridDetector.cpp | 4 +-- .../MultiplePointCloudsRegistrator.cpp | 14 +++++++- .../Public/GridDetector.h | 32 ++++++------------- .../Public/MultiplePointCloudsRegistrator.h | 30 ++++++++++++++++- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Private/GridDetector.cpp b/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Private/GridDetector.cpp index 4a8579cc..c1cc0d16 100644 --- a/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Private/GridDetector.cpp +++ b/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Private/GridDetector.cpp @@ -1312,8 +1312,8 @@ GridDetectionResult GridDetector::detectGrid(PointCloudImage pointCloud) { -MultipleGridDetectionResult GridDetector::findCorrespondencePoints(TArray<PointCloudImage> pointClouds) { - return MultipleGridDetectionResult(); +TArray<TArray<FVector>> matchGridDetectionResults(TArray<GridDetectionResult> results) { + return TArray<TArray<FVector>>(); } MotionControllerResult GridDetector::findMotionControllerInPointcloud(PointCloudImage, MotionControllerAssumptions controllerAssumptions) { diff --git a/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Private/MultiplePointCloudsRegistrator.cpp b/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Private/MultiplePointCloudsRegistrator.cpp index 49df09c8..011b4587 100644 --- a/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Private/MultiplePointCloudsRegistrator.cpp +++ b/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Private/MultiplePointCloudsRegistrator.cpp @@ -3,10 +3,22 @@ #include "MultiplePointCloudsRegistrator.h" -MultiplePointCloudsRegistrator::MultiplePointCloudsRegistrator() +MultiplePointCloudsRegistrator::MultiplePointCloudsRegistrator(int pPointCloudCount) + : pointCloudCount(pPointCloudCount) { + correspondencePoints = new TArray<pcl::PointCloud<pcl::PointXYZ>>[pPointCloudCount]; } MultiplePointCloudsRegistrator::~MultiplePointCloudsRegistrator() { + delete[] correspondencePoints; + correspondencePoints = nullptr; } + +void MultiplePointCloudsRegistrator::addCorrespondencePoints(TArray<TArray<FVector>> points) { + +} + +TArray<FTransform> MultiplePointCloudsRegistrator::registrateInto(int pointCloudID) { + return TArray<FTransform>(); +} \ No newline at end of file diff --git a/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Public/GridDetector.h b/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Public/GridDetector.h index 992b1ebc..09f68cec 100644 --- a/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Public/GridDetector.h +++ b/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Public/GridDetector.h @@ -25,21 +25,6 @@ struct PointCloudImage { {} }; -/* -* Struct which contains the results of grid detection in multiple -* point clouds. -* -* In this case, I simply use array of arrays so the user can simply -* use the hole points and give them directly to the multiple point cloud -* registrator instead of returning a TArray<GridDetectionResult>. -*/ - -struct MultipleGridDetectionResult { - TArray<bool> gridFound; - TArray<TArray<FVector>> holePoints; - TArray<FTransform> gridTransform; -}; - /* * Result of a grid detection in a single point cloud. */ @@ -47,7 +32,7 @@ struct MultipleGridDetectionResult { struct GridDetectionResult { bool gridFound = false; - // Mid points of the grid holes (not sorted yet): + // Mid points of the grid holes (not sorted yet!): TArray<FVector> centersOfFoundHoles; // Location of the grid center: @@ -100,13 +85,6 @@ public: GridDetector(); ~GridDetector(); - /* - * Finds correspondence points between the given point clouds. For each image, this algorithm - * can return multiple points. - */ - - MultipleGridDetectionResult findCorrespondencePoints(TArray<PointCloudImage> pointClouds); - /* * Detect the grid in a single point cloud. */ @@ -114,6 +92,14 @@ public: GridDetectionResult detectGrid(PointCloudImage pointCloud); + /** + * Matches all the hole centers of the grid detection result and returns for each GridDetectionResult + * an array with the matched hole centers (that means that a specific hole center has the same index + * in each array, considering the orientation). + */ + + TArray<TArray<FVector>> matchGridDetectionResults(TArray<GridDetectionResult> results); + /* * Finds the motion controller positions in a given point cloud by finding the grid and use * assumptions about where the motion controllers are relative to the grid. diff --git a/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Public/MultiplePointCloudsRegistrator.h b/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Public/MultiplePointCloudsRegistrator.h index 67bbeb05..e3a9b385 100644 --- a/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Public/MultiplePointCloudsRegistrator.h +++ b/VRKinectReg/Plugins/VRKinectRegistration/Source/VRKinectRegistration/Public/MultiplePointCloudsRegistrator.h @@ -4,13 +4,41 @@ #include "CoreMinimal.h" +#include "GridDetector.h" + +THIRD_PARTY_INCLUDES_START +#include <pcl/io/pcd_io.h> +#include <pcl/point_types.h> +#include <pcl/registration/transformation_estimation.h> +#include <pcl/registration/transformation_estimation_svd.h> +THIRD_PARTY_INCLUDES_END + + /** * */ class VRKINECTREGISTRATION_API MultiplePointCloudsRegistrator { +private: + int pointCloudCount; + TArray<pcl::PointCloud<pcl::PointXYZ>>* correspondencePoints; + public: - MultiplePointCloudsRegistrator(); + MultiplePointCloudsRegistrator(int pointCloudCount); ~MultiplePointCloudsRegistrator(); + + /** + * Adds correspondence points of multiple pointclouds. + */ + + void addCorrespondencePoints(TArray<TArray<FVector>> points); + + /** + * Registrates all the point clouds into the pointcloud of the given pointCloudID. + * + * The transform with the id of the given point cloud id will be the identity. + */ + + TArray<FTransform> registrateInto(int pointCloudID); }; -- GitLab