diff --git a/applications/reconstruct/src/dibr.cu b/applications/reconstruct/src/dibr.cu index 141c5dc81df92e167281fded41e19bac39968039..91e51ec462e054bdb75e72e72e84bdb71846f21c 100644 --- a/applications/reconstruct/src/dibr.cu +++ b/applications/reconstruct/src/dibr.cu @@ -418,6 +418,10 @@ __device__ inline float warpMin(float e) { const int x = (blockIdx.x*blockDim.x + threadIdx.x) / WARP_SIZE; const int y = blockIdx.y*blockDim.y + threadIdx.y; + float clusterBase = params.camera.m_sensorDepthWorldMin; + + while (clusterBase < params.camera.m_sensorDepthWorldMax) { + const int lane = tid % WARP_SIZE; if (lane == 0) { minimum[warp] = 100000000; @@ -428,6 +432,8 @@ __device__ inline float warpMin(float e) { __syncwarp(); // Search for a valid minimum neighbour + // TODO: Should this really be minimum or the median of a depth cluster? + // cluster median seems very hard to calculate... for (int i=lane; i<NEIGHBOR_WINDOW; i+=WARP_SIZE) { const int u = (i % (2*NEIGHBOR_RADIUS_2+1)) - NEIGHBOR_RADIUS_2; const int v = (i / (2*NEIGHBOR_RADIUS_2+1)) - NEIGHBOR_RADIUS_2; @@ -435,7 +441,7 @@ __device__ inline float warpMin(float e) { const float3 camPos = params.camera.kinectDepthToSkeleton(x, y, point.z); // If it is close enough... - if (point.z > params.camera.m_sensorDepthWorldMin && point.z < params.camera.m_sensorDepthWorldMax && length(point - camPos) <= 0.02f) { + if (point.z > clusterBase && point.z < params.camera.m_sensorDepthWorldMax && length(point - camPos) <= SPATIAL_SMOOTHING) { atomicMin(&minimum[warp], point.z*1000.0f); } } @@ -457,7 +463,7 @@ __device__ inline float warpMin(float e) { const float3 point = params.camera.kinectDepthToSkeleton(x+u, y+v, float(point_in.tex2D(x+u, y+v)) / 1000.0f); // If it is close enough... - if (point.z > params.camera.m_sensorDepthWorldMin && point.z < params.camera.m_sensorDepthWorldMax && length(point - minPos) <= 0.02f) { + if (point.z > params.camera.m_sensorDepthWorldMin && point.z < params.camera.m_sensorDepthWorldMax && length(point - minPos) <= SPATIAL_SMOOTHING) { // Append to neighbour list //unsigned int idx = atomicInc(&nidx[warp], MAX_NEIGHBORS_2-1); unsigned int idx = atomicAdd(&nidx[warp], 1); @@ -517,6 +523,12 @@ __device__ inline float warpMin(float e) { //depth(cx,cy) = bestdepth * 1000.0f; } } + + if (maxenergy >= 0.1f) return; + + clusterBase = minDepth + SPATIAL_SMOOTHING; + + }; } // ===== Pass 2 and 3 : Attribute contributions ================================