From df49b853a5a74985d51fe7bd8afe0c7687b6e021 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Mon, 16 Mar 2020 09:11:04 +0200
Subject: [PATCH] Fixes for bad HDR conversion

---
 SDK/C/include/ftl/ftl.h      |  3 ++-
 SDK/C/src/streams.cpp        | 21 +++++++++++++++------
 SDK/Python/blender_script.py | 10 ++++++----
 3 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/SDK/C/include/ftl/ftl.h b/SDK/C/include/ftl/ftl.h
index 33ff215da..2820e2436 100644
--- a/SDK/C/include/ftl/ftl.h
+++ b/SDK/C/include/ftl/ftl.h
@@ -93,7 +93,8 @@ enum ftlImageFormat_t {
 	FTLIMAGE_BGRA,
 	FTLIMAGE_RGBA,
 	FTLIMAGE_RGB,
-	FTLIMAGE_BGR
+	FTLIMAGE_BGR,
+	FTLIMAGE_RGB_FLOAT		// Used by Blender
 };
 
 #ifdef __cplusplus
diff --git a/SDK/C/src/streams.cpp b/SDK/C/src/streams.cpp
index cef412617..94b1fb014 100644
--- a/SDK/C/src/streams.cpp
+++ b/SDK/C/src/streams.cpp
@@ -133,9 +133,17 @@ ftlError_t ftlImageWrite(
 		case FTLIMAGE_RGB		:	tmp = cv::Mat(intrin.height, intrin.width, CV_8UC3, const_cast<void*>(data), pitch);
 									cv::cvtColor(tmp, tmp2, cv::COLOR_RGB2BGRA);
 									break;
+		case FTLIMAGE_RGB_FLOAT	:	tmp = cv::Mat(intrin.height, intrin.width, CV_32FC3, const_cast<void*>(data), pitch);
+									tmp.convertTo(tmp2, CV_8UC3, 255.0f);
+									cv::cvtColor(tmp2, tmp2, cv::COLOR_RGB2BGRA);
+									break;
 		default					: return FTLERROR_STREAM_BAD_IMAGE_TYPE;
 		}
 
+		double minVal, maxVal;
+		cv::minMaxLoc(tmp, &minVal, &maxVal);
+		LOG(INFO) << "MIN MAX " << minVal << " - " << maxVal;
+
 		if (tmp2.empty()) return FTLERROR_STREAM_NO_DATA;
 		cv::flip(tmp2, tmp2, 0);  // Flip to get opencv form.
 		img.upload(tmp2);
@@ -278,26 +286,27 @@ ftlError_t ftlDestroyStream(ftlStream_t stream) {
 	if (!stream) return FTLERROR_STREAM_INVALID_STREAM;
 	if (!stream->stream) return FTLERROR_STREAM_INVALID_STREAM;
 
-	ftl::pool.push([stream](int id) {
-		//ftlError_t err = FTLERROR_OK;
+	//ftl::pool.push([stream](int id) {
+		ftlError_t err = FTLERROR_OK;
 
 		if (stream->has_fresh_data) {
 			try {
 				cudaSetDevice(0);
 				stream->sender->post(stream->video_fs);
 			} catch (const std::exception &e) {
-				//err = FTLERROR_STREAM_ENCODE_FAILED;
+				err = FTLERROR_STREAM_ENCODE_FAILED;
 			}
 		}
 
 		if (!stream->stream->end()) {
-			//err = FTLERROR_STREAM_FILE_CREATE_FAILED;
+			err = FTLERROR_STREAM_FILE_CREATE_FAILED;
 		}
 		if (stream->sender) delete stream->sender;
 		delete stream->stream;
 		stream->sender = nullptr;
 		stream->stream = nullptr;
 		delete stream;
-	});
-	return FTLERROR_OK;
+	//});
+	//return FTLERROR_OK;
+	return err;
 }
diff --git a/SDK/Python/blender_script.py b/SDK/Python/blender_script.py
index ce8504839..8af70b4bd 100644
--- a/SDK/Python/blender_script.py
+++ b/SDK/Python/blender_script.py
@@ -195,7 +195,8 @@ def render():
     pix = np.array(pixels.pixels[:])
     
     # sRGB conversion
-    pix2 = np.zeros(pix.shape[:], dtype=np.float)
+    #pix2 = np.zeros(pix.shape[:], dtype=np.float)
+    pix2 = np.copy(pix)
     np.copyto(pix2, 1.055*(pix**(1.0/2.4)) - 0.055, where=pix <= 1)
     np.copyto(pix2, pix * 12.92, where=pix <= 0.0031308)
     
@@ -204,12 +205,13 @@ def render():
     
     
     im = pix2.reshape((pixels.size[1], pixels.size[0], pixels.channels))
+    im2 = (im[:,:,0:3]).astype(np.float32)
     
     depthim = (np.array(pixels.pixels[:]).reshape((pixels.size[1], pixels.size[0], pixels.channels))[:,:,3]).astype(np.float32)
     # set invalid depth values to 0.0
     depthim[depthim >= _d_max] = 0.0
     
-    return (im[:,:,0:3]*255.0).astype(np.uint8), depthim
+    return im2, depthim
 
 def render_stereo(camera, baseline=0.15):
     bpy.context.scene.camera = camera
@@ -262,9 +264,9 @@ resolution_y_in_px = scale * bpy.context.scene.render.resolution_y
 err = ftlIntrinsicsWriteLeft(c_void_p(stream), c_int(0), c_int(int(image.intrinsics.width)), c_int(int(image.intrinsics.height)), c_float(image.intrinsics.fx), c_float(image.intrinsics.cx), c_float(image.intrinsics.cy), c_float(image.intrinsics.baseline), c_float(image.intrinsics.min_depth), c_float(image.intrinsics.max_depth))
 err = ftlIntrinsicsWriteRight(c_void_p(stream), c_int(0), c_int(int(image.intrinsics.width)), c_int(int(image.intrinsics.height)), c_float(image.intrinsics.fx), c_float(image.intrinsics.cx), c_float(image.intrinsics.cy), c_float(image.intrinsics.baseline), c_float(image.intrinsics.min_depth), c_float(image.intrinsics.max_depth))
 print(err)
-err = ftlImageWrite(stream, 0, 0, 3, 0, image.imL.ctypes.data_as(c_void_p))
+err = ftlImageWrite(stream, 0, 0, 5, 0, image.imL.ctypes.data_as(c_void_p))
 print(err)
-err = ftlImageWrite(stream, 0, 2, 3, 0, image.imR.ctypes.data_as(c_void_p))
+err = ftlImageWrite(stream, 0, 2, 5, 0, image.imR.ctypes.data_as(c_void_p))
 print(err)
 err = ftlImageWrite(stream, 0, 22, 0, 0, image.depthL.ctypes.data_as(c_void_p))
 print(err)
-- 
GitLab