From d0c10bb216403cf121e3e61c904ee0bdb71f7d19 Mon Sep 17 00:00:00 2001
From: Sebastian Hahta <joseha@utu.fi>
Date: Tue, 8 Oct 2019 10:10:42 +0300
Subject: [PATCH] additional (debug) output

---
 applications/calibration-multi/src/main.cpp | 47 +++++++++++++++------
 1 file changed, 33 insertions(+), 14 deletions(-)

diff --git a/applications/calibration-multi/src/main.cpp b/applications/calibration-multi/src/main.cpp
index 8549bd735..bee370d4c 100644
--- a/applications/calibration-multi/src/main.cpp
+++ b/applications/calibration-multi/src/main.cpp
@@ -39,7 +39,7 @@ using ftl::net::Universe;
 using ftl::rgbd::Source;
 using ftl::rgbd::Channel;
 
-Mat getCameraMatrix(const ftl::rgbd::Camera &parameters) {
+Mat createCameraMatrix(const ftl::rgbd::Camera &parameters) {
 	Mat m = (cv::Mat_<double>(3,3) << parameters.fx, 0.0, -parameters.cx, 0.0, parameters.fy, -parameters.cy, 0.0, 0.0, 1.0);
 	return m;
 }
@@ -173,7 +173,7 @@ void visualizeCalibration(	MultiCameraCalibrationNew &calib, Mat &out,
 		Scalar(64, 255, 64),
 		Scalar(64, 255, 64),
 	};
-
+	
 	vector<int> markers = {cv::MARKER_SQUARE, cv::MARKER_DIAMOND};
 
 	for (size_t c = 0; c < rgb.size(); c++) {
@@ -183,8 +183,12 @@ void visualizeCalibration(	MultiCameraCalibrationNew &calib, Mat &out,
 		for (int r = 50; r < rgb[c].rows; r = r+50) {
 			cv::line(rgb[c], cv::Point(0, r), cv::Point(rgb[c].cols-1, r), cv::Scalar(0,0,255), 1);
 		}
-	}
 
+		cv::putText(rgb[c],
+			"Camera " + std::to_string(c),
+			Point2i(roi[c].x + 10, roi[c].y + 30),
+			cv::FONT_HERSHEY_COMPLEX_SMALL, 1.0, Scalar(64, 64, 255), 1);
+	}
 	stack(rgb, out);
 }
 
@@ -233,10 +237,19 @@ void calibrate(	MultiCameraCalibrationNew &calib, vector<string> &uri_cameras,
 		Mat P1, P2, Q;
 		Mat R1, R2;
 		Mat R_c1c2, T_c1c2;
-
+		LOG(INFO) << K1;
+		LOG(INFO) << K2;
+		
 		calculateTransform(R[c], t[c], R[c + 1], t[c + 1], R_c1c2, T_c1c2);
 		cv::stereoRectify(K1, D1, K2, D2, params.size, R_c1c2, T_c1c2, R1, R2, P1, P2, Q, 0, params.alpha);
 
+		Mat rvec;
+		cv::Rodrigues(R_c1c2, rvec);
+		LOG(INFO) << "From camera " << c << " to " << c + 1;
+		LOG(INFO) << "rotation:    " << rvec.t();
+		LOG(INFO) << "translation: " << T_c1c2.t();
+
+		// calculate extrinsics from rectified parameters
 		Mat _t = Mat(Size(1, 3), CV_64FC1, Scalar(0.0));
 		Rt_out[c] = getMat4x4(R[c], t[c]) * getMat4x4(R1, _t).inv();
 		Rt_out[c + 1] = getMat4x4(R[c + 1], t[c + 1]) * getMat4x4(R2, _t).inv();
@@ -247,19 +260,23 @@ void calibrate(	MultiCameraCalibrationNew &calib, vector<string> &uri_cameras,
 			size_t pos2 = uri_cameras[c/2].find("#", pos1);
 			node_name = uri_cameras[c/2].substr(pos1, pos2 - pos1);
 			
-			if (params.save_extrinsic) {
-				// TODO:	only R and T required, rectification performed on vision node,
-				//			consider saving global extrinsic calibration?
-				saveExtrinsics(params.output_path + node_name + "-extrinsic.yml", R_c1c2, T_c1c2, R1, R2, P1, P2, Q);
+			if (params.save_extrinsic)
+			{
+				// TODO:	only R and T required when rectification performed
+				//			on vision node. Consider saving extrinsic global
+				//			for node as well?
+				saveExtrinsics(	params.output_path + node_name + "-extrinsic.yml",
+								R_c1c2, T_c1c2, R1, R2, P1, P2, Q
+				);
 				LOG(INFO) << "Saved: " << params.output_path + node_name + "-extrinsic.yml";
 			}
-			if (params.save_intrinsic) {
+
+			if (params.save_intrinsic)
+			{
 				saveIntrinsics(
 					params.output_path + node_name + "-intrinsic.yml",
-					{calib.getCameraMat(c),
-					 calib.getCameraMat(c + 1)},
+					{ calib.getCameraMat(c), calib.getCameraMat(c + 1) },
 					params.size
-
 				);
 				LOG(INFO) << "Saved: " << params.output_path + node_name + "-intrinsic.yml";
 			}
@@ -268,6 +285,8 @@ void calibrate(	MultiCameraCalibrationNew &calib, vector<string> &uri_cameras,
 		// for visualization
 		Size new_size;
 		cv::stereoRectify(K1, D1, K2, D2, params.size, R_c1c2, T_c1c2, R1, R2, P1, P2, Q, 0, 1.0, new_size, &roi[c], &roi[c + 1]);
+		//roi[c] = cv::Rect(0, 0, params.size.width, params.size.height);
+		//roi[c+1] = cv::Rect(0, 0, params.size.width, params.size.height);
 		cv::initUndistortRectifyMap(K1, D1, R1, P1, params.size, CV_16SC2, map1[c], map2[c]);
 		cv::initUndistortRectifyMap(K2, D2, R2, P2, params.size, CV_16SC2, map1[c + 1], map2[c + 1]);
 	}
@@ -393,11 +412,11 @@ void runCameraCalibration(	ftl::Configurable* root,
 		CHECK(params.size == Size(camera_l.width, camera_l.height));
 		
 		Mat K;
-		K = getCameraMatrix(camera_r);
+		K = createCameraMatrix(camera_r);
 		LOG(INFO) << "K[" << 2 * i + 1 << "] = \n" << K;
 		calib.setCameraParameters(2 * i + 1, K);
 
-		K = getCameraMatrix(camera_l);
+		K = createCameraMatrix(camera_l);
 		LOG(INFO) << "K[" << 2 * i << "] = \n" << K;
 		calib.setCameraParameters(2 * i, K);
 	}
-- 
GitLab