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