From 01eb49b6b645a0d774f49578fb9566ce8ccd975c Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Sun, 15 Mar 2020 18:34:43 +0200
Subject: [PATCH] Fixes for bad opencv depth encode

---
 SDK/Python/blender_script.py             | 35 ++++++++++++++++++------
 components/codecs/src/generate.cpp       |  1 +
 components/codecs/src/opencv_encoder.cpp |  6 ++--
 3 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/SDK/Python/blender_script.py b/SDK/Python/blender_script.py
index 753cabe50..efc381e21 100644
--- a/SDK/Python/blender_script.py
+++ b/SDK/Python/blender_script.py
@@ -140,19 +140,36 @@ def render():
     rl = tree.nodes.new('CompositorNodeRLayers')
 
     v = tree.nodes.new('CompositorNodeViewer')
-    v.use_alpha = True
+    v.use_alpha = False
+
+    #setup the depthmap calculation using blender's mist function:
+    #bpy.context.scene.render.layers['RenderLayer'].use_pass_mist = True
+    #bpy.context.scene.view_layers["View Layer"].use_pass_mist = True
+    #the depthmap can be calculated as the distance between objects and camera ('LINEAR'), or square/inverse square of the distance ('QUADRATIC'/'INVERSEQUADRATIC'):
+    bpy.context.scene.world.mist_settings.falloff = 'LINEAR'
+    #minimum depth:
+    bpy.context.scene.world.mist_settings.intensity = 0.1
+    #maximum depth (can be changed depending on the scene geometry to normalize the depth map whatever the camera orientation and position is):
+    bpy.context.scene.world.mist_settings.depth = 8.0
+
+    links.new(rl.outputs['Depth'],v.inputs['Image'])
+    bpy.ops.render.render()
+    pixels = bpy.data.images['Viewer Node']
+    depthim = (np.array(pixels.pixels[:]).reshape((pixels.size[1], pixels.size[0], pixels.channels))[:,:,0]).astype(np.float32)
+    # set invalid depth values to 0.0
+    depthim[depthim >= _d_max] = 0.0
+
+    print(np.amax(depthim))
 
     links.new(rl.outputs['Image'], v.inputs['Image'])
     # depth cannot be accessed in python; hack uses alpha to store z-values
-    links.new(rl.outputs['Depth'], v.inputs['Alpha'])
+    #links.new(rl.outputs['Depth'], v.inputs['Alpha'])
 
     bpy.ops.render.render()
-    pixels = bpy.data.images['Viewer Node']
-    im = np.array(pixels.pixels[:]).reshape((pixels.size[1], pixels.size[0], pixels.channels))
+    pixels2 = bpy.data.images['Viewer Node']
+    im = np.array(pixels2.pixels[:]).reshape((pixels2.size[1], pixels2.size[0], pixels2.channels))
     
-    # set invalid depth values to 0.0
-    im[:,:,3][im[:,:,3] >= _d_max] = 0.0
-    return (im[:,:,0:3]*255.0).astype(np.uint8), (im[:,:,3]).astype(np.float32)
+    return (im[:,:,0:3]*255.0).astype(np.uint8), depthim
 
 def render_stereo(camera, baseline=0.15):
     bpy.context.scene.camera = camera
@@ -207,8 +224,8 @@ err = ftlImageWrite(stream, 0, 0, 3, 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))
 print(err)
-#err = ftlImageWrite(stream, 0, 1, 0, 0, image.depthL.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)
 err = ftlDestroyStream(stream)
 print(err)
 
diff --git a/components/codecs/src/generate.cpp b/components/codecs/src/generate.cpp
index b6b3c3be9..f39167dfd 100644
--- a/components/codecs/src/generate.cpp
+++ b/components/codecs/src/generate.cpp
@@ -30,6 +30,7 @@ void init_encoders() {
 
     encoders.push_back(new ftl::codecs::OpenCVEncoder(definition_t::HD1080, definition_t::HD720));
     encoders.push_back(new ftl::codecs::OpenCVEncoder(definition_t::HD1080, definition_t::HD720));
+	encoders.push_back(new ftl::codecs::OpenCVEncoder(definition_t::HD1080, definition_t::HD720));
     encoders.push_back(new ftl::codecs::OpenCVEncoder(definition_t::SD576, definition_t::LD360));
     encoders.push_back(new ftl::codecs::OpenCVEncoder(definition_t::SD576, definition_t::LD360));
 	encoders.push_back(new ftl::codecs::OpenCVEncoder(definition_t::SD576, definition_t::LD360));
diff --git a/components/codecs/src/opencv_encoder.cpp b/components/codecs/src/opencv_encoder.cpp
index 2d2e19b56..1bb968128 100644
--- a/components/codecs/src/opencv_encoder.cpp
+++ b/components/codecs/src/opencv_encoder.cpp
@@ -56,9 +56,9 @@ bool OpenCVEncoder::encode(const cv::cuda::GpuMat &in, ftl::codecs::Packet &pkt)
 	in.download(tmp_);
 	//CHECK(cv::Size(ftl::codecs::getWidth(definition), ftl::codecs::getHeight(definition)) == in.size()); 
 
-	if (!is_colour) {
-		tmp_.convertTo(tmp_, CV_16U, 1000.0f);
-	}
+	//if (!is_colour) {
+		//tmp_.convertTo(tmp_, CV_16U, 1000.0f);
+	//}
 
 	int width = ftl::codecs::getWidth(current_definition_);
 	int height = ftl::codecs::getHeight(current_definition_);
-- 
GitLab