diff --git a/components/operators/src/mls.cu b/components/operators/src/mls.cu index 70d801f2f23cbf79ce366b5e770640c31a67b18e..64fb921df7b25954ac133d51a94c1204145f868b 100644 --- a/components/operators/src/mls.cu +++ b/components/operators/src/mls.cu @@ -273,54 +273,55 @@ __device__ inline int segmentID(int u, int v) { for (int u=-baseY.x; u<=baseY.y; ++u) { const float d = depth_in.tex2D(x+u, y+v); - if (d < camera.minDepth || d > camera.maxDepth) continue; + if (d > camera.minDepth && d < camera.maxDepth) { - // Point and normal of neighbour - const float3 Xi = camera.screenToCam((int)(x)+u,(int)(y)+v,d); - const float3 Ni = make_float3(normals_in.tex2D((int)(x)+u, (int)(y)+v)); + // Point and normal of neighbour + const float3 Xi = camera.screenToCam((int)(x)+u,(int)(y)+v,d); + const float3 Ni = make_float3(normals_in.tex2D((int)(x)+u, (int)(y)+v)); - if (Ni.x+Ni.y+Ni.z == 0.0f) continue; + if (Ni.x+Ni.y+Ni.z == 0.0f) continue; - const float4 c = colour_in.tex2D(float(x+u) + 0.5f, float(y+v) + 0.5f); - const float cw = ftl::cuda::colourWeighting(c0,c,colour_smoothing); + const float4 c = colour_in.tex2D(float(x+u) + 0.5f, float(y+v) + 0.5f); + const float cw = ftl::cuda::colourWeighting(c0,c,colour_smoothing); - // Allow missing point to borrow z value - // TODO: This is a bad choice of Z! Perhaps try histogram vote approach - if (FILLING && d0 == 0.0f) X = camera.screenToCam((int)(x),(int)(y),Xi.z); + // Allow missing point to borrow z value + // TODO: This is a bad choice of Z! Perhaps try histogram vote approach + if (FILLING && d0 == 0.0f) X = camera.screenToCam((int)(x),(int)(y),Xi.z); - // Gauss approx weighting function using point distance - const float w = ftl::cuda::spatialWeighting(X,Xi,smoothing*cw); + // Gauss approx weighting function using point distance + const float w = ftl::cuda::spatialWeighting(X,Xi,smoothing*cw); - aX += Xi*w; - nX += Ni*w; - contrib += w; - if (FILLING && w > 0.0f && v > -base.z+1 && v < base.w-1 && u > -baseY.x+1 && u < baseY.y-1) segment_check |= segmentID(u,v); + aX += Xi*w; + nX += Ni*w; + contrib += w; + if (FILLING && w > 0.0f && v > -base.z+1 && v < base.w-1 && u > -baseY.x+1 && u < baseY.y-1) segment_check |= segmentID(u,v); + } } } - if (contrib == 0.0f) return; - - nX /= contrib; // Weighted average normal - aX /= contrib; // Weighted average point (centroid) + if (contrib > 0.0f) { + nX /= contrib; // Weighted average normal + aX /= contrib; // Weighted average point (centroid) - if (FILLING && d0 == 0.0f) { - if (__popc(segment_check) < 3) return; - X = camera.screenToCam((int)(x),(int)(y),aX.z); - } + if (FILLING && d0 == 0.0f) { + if (__popc(segment_check) < 3) return; + X = camera.screenToCam((int)(x),(int)(y),aX.z); + } - // Signed-Distance Field function - float fX = nX.x * (X.x - aX.x) + nX.y * (X.y - aX.y) + nX.z * (X.z - aX.z); + // Signed-Distance Field function + float fX = nX.x * (X.x - aX.x) + nX.y * (X.y - aX.y) + nX.z * (X.z - aX.z); - // Calculate new point using SDF function to adjust depth (and position) - X = X - nX * fX; - - //uint2 screen = camera.camToScreen<uint2>(X); + // Calculate new point using SDF function to adjust depth (and position) + X = X - nX * fX; + + //uint2 screen = camera.camToScreen<uint2>(X); - //if (screen.x < depth_out.width() && screen.y < depth_out.height()) { - // depth_out(screen.x,screen.y) = X.z; - //} - depth_out(x,y) = X.z; - normals_out(x,y) = make_float4(nX / length(nX), 0.0f); + //if (screen.x < depth_out.width() && screen.y < depth_out.height()) { + // depth_out(screen.x,screen.y) = X.z; + //} + depth_out(x,y) = X.z; + normals_out(x,y) = make_float4(nX / length(nX), 0.0f); + } } void ftl::cuda::colour_mls_smooth_csr( diff --git a/components/operators/src/smoothing.cpp b/components/operators/src/smoothing.cpp index 359b17714787a5775433e5b7e8af6faa848b36c3..8b49b9676b4cb44d1da769d0e2538ba801aae2df 100644 --- a/components/operators/src/smoothing.cpp +++ b/components/operators/src/smoothing.cpp @@ -179,11 +179,11 @@ ColourMLS::~ColourMLS() { } bool ColourMLS::apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, ftl::rgbd::Source *s, cudaStream_t stream) { - float thresh = config()->value("mls_threshold", 0.04f); + float thresh = config()->value("mls_threshold", 0.4f); float col_smooth = config()->value("mls_colour_smoothing", 30.0f); - int iters = config()->value("mls_iterations", 10); + int iters = config()->value("mls_iterations", 3); int radius = config()->value("mls_radius",3); - bool crosssup = config()->value("cross_support", false); + bool crosssup = config()->value("cross_support", true); bool filling = config()->value("filling", false); if (!in.hasChannel(Channel::Normals)) {