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