diff --git a/applications/reconstruct/src/depth_camera.cu b/applications/reconstruct/src/depth_camera.cu index 39a6dcf3b282810fb5cda1d4d75949cb63e8d2c4..47ecf8822cf8e36b75a1024909c2165b082e0b31 100644 --- a/applications/reconstruct/src/depth_camera.cu +++ b/applications/reconstruct/src/depth_camera.cu @@ -38,14 +38,19 @@ extern __device__ float spatialWeighting(float r); * Real-time foreground-background segmentation using codebook model. * Real-Time Imaging. https://doi.org/10.1016/j.rti.2004.12.004 */ - __device__ float colordiffFloat(const uchar4 &pa, const uchar4 &pb) { - float x_2 = pb.x * pb.x + pb.y * pb.y + pb.z * pb.z; - float v_2 = pa.x * pa.x + pa.y * pa.y + pa.z * pa.z; - float xv_2 = pow(pb.x * pa.x + pb.y * pa.y + pb.z * pa.z, 2); - float p_2 = xv_2 / v_2; + __device__ inline float colordiffFloat(const uchar4 &pa, const uchar4 &pb) { + const float x_2 = pb.x * pb.x + pb.y * pb.y + pb.z * pb.z; + const float v_2 = pa.x * pa.x + pa.y * pa.y + pa.z * pa.z; + const float xv_2 = pow(pb.x * pa.x + pb.y * pa.y + pb.z * pa.z, 2); + const float p_2 = xv_2 / v_2; return sqrt(x_2 - p_2); } +__device__ float colordiffFloat2(const uchar4 &pa, const uchar4 &pb) { + float3 delta = make_float3((float)pa.x - (float)pb.x, (float)pa.y - (float)pb.y, (float)pa.z - (float)pb.z); + return length(delta); +} + /* * Colour weighting as suggested in: * C. Kuster et al. Spatio-Temporal Geometry Fusion for Multiple Hybrid Cameras using Moving Least Squares Surfaces. 2014. @@ -98,7 +103,7 @@ __global__ void mls_smooth_kernel(ftl::cuda::TextureObject<float> output, HashDa uchar4 c2 = tex2D<uchar4>(camera.colour, screenPos.x+u, screenPos.y+v); //float4 normal = tex2D<float4>(camera.normal, screenPos.x+u, screenPos.y+v); const float3 worldPos = camera.pose * camera.params.kinectDepthToSkeleton(screenPos.x+u, screenPos.y+v, depth); - const float weight = spatialWeighting(length(mPos - worldPos))*colourWeighting(colordiffFloat(c1,c2)); + const float weight = spatialWeighting(length(mPos - worldPos))*colourWeighting(colordiffFloat2(c1,c2)); wpos += weight*worldPos; //wnorm += weight*make_float3(normal);