Skip to content
Snippets Groups Projects
Commit 98e6cbe7 authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Implements #247 symmetric supports

parent bb6be469
No related branches found
No related tags found
No related merge requests found
......@@ -22,7 +22,8 @@ bool CrossSupport::apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, ftl::rgbd:
out.createTexture<uchar4>(Channel::Support2, ftl::rgbd::Format<uchar4>(in.get<cv::cuda::GpuMat>(Channel::Colour).size())),
config()->value("depth_tau", 0.04f),
config()->value("v_max", 5),
config()->value("h_max", 5), stream
config()->value("h_max", 5),
config()->value("symmetric", true), stream
);
} //else {
ftl::cuda::support_region(
......@@ -30,7 +31,8 @@ bool CrossSupport::apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, ftl::rgbd:
out.createTexture<uchar4>(Channel::Support1, ftl::rgbd::Format<uchar4>(in.get<cv::cuda::GpuMat>(Channel::Colour).size())),
config()->value("tau", 5.0f),
config()->value("v_max", 5),
config()->value("h_max", 5), stream
config()->value("h_max", 5),
config()->value("symmetric", true), stream
);
//}
......
......@@ -22,7 +22,7 @@ __device__ inline float cross<float>(float p1, float p2) {
return fabs(p1-p2);
}
template <typename T>
template <typename T, bool SYM>
__device__ uchar4 calculate_support_region(const TextureObject<T> &img, int x, int y, float tau, int v_max, int h_max) {
int x_min = max(0, x - h_max);
int x_max = min(img.width()-1, x + h_max);
......@@ -79,17 +79,24 @@ __device__ uchar4 calculate_support_region(const TextureObject<T> &img, int x, i
}
if (v > y_max) result.w = y_max - y;
// Make symetric left/right and up/down
if (SYM) {
result.x = min(result.x, result.y);
result.y = result.x;
result.z = min(result.z, result.w);
result.w = result.z;
}
return result;
}
template <typename T>
template <typename T, bool SYM>
__global__ void support_region_kernel(TextureObject<T> img, TextureObject<uchar4> region, float tau, int v_max, int h_max) {
const int x = blockIdx.x*blockDim.x + threadIdx.x;
const int y = blockIdx.y*blockDim.y + threadIdx.y;
if (x < 0 || y < 0 || x >= img.width() || y >= img.height()) return;
region(x,y) = calculate_support_region(img, x, y, tau, v_max, h_max);
region(x,y) = calculate_support_region<T,SYM>(img, x, y, tau, v_max, h_max);
}
void ftl::cuda::support_region(
......@@ -97,13 +104,15 @@ void ftl::cuda::support_region(
ftl::cuda::TextureObject<uchar4> &region,
float tau,
int v_max,
int h_max,
int h_max,
bool sym,
cudaStream_t stream) {
const dim3 gridSize((region.width() + T_PER_BLOCK - 1)/T_PER_BLOCK, (region.height() + T_PER_BLOCK - 1)/T_PER_BLOCK);
const dim3 blockSize(T_PER_BLOCK, T_PER_BLOCK);
support_region_kernel<<<gridSize, blockSize, 0, stream>>>(colour, region, tau, v_max, h_max);
if (sym) support_region_kernel<uchar4, true><<<gridSize, blockSize, 0, stream>>>(colour, region, tau, v_max, h_max);
else support_region_kernel<uchar4, false><<<gridSize, blockSize, 0, stream>>>(colour, region, tau, v_max, h_max);
cudaSafeCall( cudaGetLastError() );
......@@ -118,12 +127,13 @@ void ftl::cuda::support_region(
float tau,
int v_max,
int h_max,
bool sym,
cudaStream_t stream) {
const dim3 gridSize((region.width() + T_PER_BLOCK - 1)/T_PER_BLOCK, (region.height() + T_PER_BLOCK - 1)/T_PER_BLOCK);
const dim3 blockSize(T_PER_BLOCK, T_PER_BLOCK);
support_region_kernel<<<gridSize, blockSize, 0, stream>>>(depth, region, tau, v_max, h_max);
support_region_kernel<float, true><<<gridSize, blockSize, 0, stream>>>(depth, region, tau, v_max, h_max);
cudaSafeCall( cudaGetLastError() );
......
......@@ -9,13 +9,13 @@ namespace cuda {
void support_region(
ftl::cuda::TextureObject<uchar4> &colour,
ftl::cuda::TextureObject<uchar4> &region,
float tau, int v_max, int h_max,
float tau, int v_max, int h_max, bool sym,
cudaStream_t stream);
void support_region(
ftl::cuda::TextureObject<float> &depth,
ftl::cuda::TextureObject<uchar4> &region,
float tau, int v_max, int h_max,
float tau, int v_max, int h_max, bool sym,
cudaStream_t stream);
void vis_support_region(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment