9 changed files with 317 additions and 92 deletions
@ -0,0 +1 @@ |
|||||
|
*.pro.* |
@ -0,0 +1,68 @@ |
|||||
|
#define TEST |
||||
|
#define X 67 |
||||
|
#define Y 194 |
||||
|
|
||||
|
#define USE_DBL |
||||
|
#ifdef USE_DBL |
||||
|
#define TYPE_FLT double |
||||
|
#define TYPE_INT long |
||||
|
#define MASK 0xFFFF |
||||
|
#define SHIFT 16 |
||||
|
#define EPSILSON 4.94065645841247E-324 |
||||
|
#else |
||||
|
#define TYPE_FLT float |
||||
|
#define TYPE_INT int |
||||
|
#define MASK 0x00FF |
||||
|
#define SHIFT 8 |
||||
|
#define EPSILSON 1.401298E-45 |
||||
|
#endif |
||||
|
|
||||
|
constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | |
||||
|
CLK_ADDRESS_CLAMP_TO_EDGE | |
||||
|
CLK_FILTER_LINEAR; |
||||
|
|
||||
|
struct input |
||||
|
{ |
||||
|
int rejectThr; |
||||
|
}; |
||||
|
|
||||
|
TYPE_FLT read_data(image2d_t input_frame, int x, int z) |
||||
|
{ |
||||
|
int2 gid = (int2)(x, z); |
||||
|
uint4 pixel = read_imageui(input_frame, sampler, gid); |
||||
|
TYPE_INT temp = (TYPE_INT)((TYPE_INT)pixel.x & MASK) | |
||||
|
(TYPE_INT)(((TYPE_INT)pixel.y & MASK) << SHIFT) | |
||||
|
(TYPE_INT)(((TYPE_INT)pixel.z & MASK) << (SHIFT * 2)) | |
||||
|
(TYPE_INT)(((TYPE_INT)pixel.w & MASK) << (SHIFT * 3)); |
||||
|
TYPE_FLT raw_data = *((TYPE_FLT*)(&temp)); |
||||
|
return raw_data; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
kernel void Rejection(read_only image2d_t input_frame, read_write image2d_t output_frame, |
||||
|
struct input params) { |
||||
|
int2 gid = (int2)(get_global_id(0), get_global_id(1)); |
||||
|
|
||||
|
TYPE_FLT output_data = 0; |
||||
|
TYPE_FLT input = read_data(input_frame, gid.x, gid.y); |
||||
|
output_data = (input - params.rejectThr) * 255 / (255 - params.rejectThr); |
||||
|
if(output_data < 0) |
||||
|
output_data = 0; |
||||
|
|
||||
|
TYPE_INT out = *((TYPE_INT*)(&output_data)); |
||||
|
uint4 pixel; |
||||
|
pixel.x = (TYPE_INT)(out & MASK); |
||||
|
pixel.y = (TYPE_INT)((out >> SHIFT) & MASK); |
||||
|
pixel.z = (TYPE_INT)((out >> (SHIFT *2)) & MASK); |
||||
|
pixel.w = (TYPE_INT)((out >> (SHIFT * 3)) & MASK); |
||||
|
|
||||
|
#ifdef TEST |
||||
|
if(gid.x == X && gid.y == Y) |
||||
|
{ |
||||
|
printf("out: %.15f | ", output_data); |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
write_imageui(output_frame, gid, pixel); |
||||
|
} |
||||
|
|
@ -0,0 +1,127 @@ |
|||||
|
#define TEST |
||||
|
#define X 923 |
||||
|
#define Y 436 |
||||
|
|
||||
|
#define USE_DBL |
||||
|
#ifdef USE_DBL |
||||
|
#define TYPE_FLT double |
||||
|
#define TYPE_INT long |
||||
|
#define MASK 0xFFFF |
||||
|
#define SHIFT 16 |
||||
|
#define EPSILSON 4.94065645841247E-324 |
||||
|
#else |
||||
|
#define TYPE_FLT float |
||||
|
#define TYPE_INT int |
||||
|
#define MASK 0x00FF |
||||
|
#define SHIFT 8 |
||||
|
#define EPSILSON 1.401298E-45 |
||||
|
#endif |
||||
|
|
||||
|
constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | |
||||
|
CLK_ADDRESS_CLAMP_TO_EDGE | |
||||
|
CLK_FILTER_LINEAR; |
||||
|
|
||||
|
struct input |
||||
|
{ |
||||
|
int output_width; |
||||
|
int grid_x_size; |
||||
|
int grid_z_size; |
||||
|
}; |
||||
|
|
||||
|
TYPE_FLT read_data(image2d_t input_frame, int x, int z) |
||||
|
{ |
||||
|
int2 gid = (int2)(x, z); |
||||
|
uint4 pixel = read_imageui(input_frame, sampler, gid); |
||||
|
TYPE_INT temp = (TYPE_INT)((TYPE_INT)pixel.x & MASK) | |
||||
|
(TYPE_INT)(((TYPE_INT)pixel.y & MASK) << SHIFT) | |
||||
|
(TYPE_INT)(((TYPE_INT)pixel.z & MASK) << (SHIFT * 2)) | |
||||
|
(TYPE_INT)(((TYPE_INT)pixel.w & MASK) << (SHIFT * 3)); |
||||
|
TYPE_FLT raw_data = *((TYPE_FLT*)(&temp)); |
||||
|
return raw_data; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
TYPE_FLT mabs(TYPE_FLT arg) |
||||
|
{ |
||||
|
if (arg < 0) |
||||
|
return -arg; |
||||
|
return arg; |
||||
|
} |
||||
|
|
||||
|
kernel void ScanConversion(read_only image2d_t input_frame, read_write image2d_t output_frame, |
||||
|
global TYPE_FLT* grid_x, global TYPE_FLT* grid_z, |
||||
|
global TYPE_FLT* query_x, global TYPE_FLT* query_z, |
||||
|
struct input params) { |
||||
|
int2 gid = (int2)(get_global_id(0), get_global_id(1)); |
||||
|
TYPE_FLT dx = grid_x[1] - grid_x[0]; |
||||
|
TYPE_FLT dz = grid_z[1] - grid_z[0]; |
||||
|
TYPE_FLT x = query_x[gid.y * params.output_width + gid.x]; |
||||
|
TYPE_FLT z = query_z[gid.y * params.output_width + gid.x]; |
||||
|
|
||||
|
int grid_x_index = 0; |
||||
|
int grid_z_index = 0; |
||||
|
|
||||
|
if(mabs(x - grid_x[params.grid_x_size - 1]) < EPSILSON) |
||||
|
grid_x_index = params.grid_x_size - 2; |
||||
|
else |
||||
|
grid_x_index = floor((x - grid_x[0]) / dx); |
||||
|
|
||||
|
if(mabs(z - grid_z[params.grid_z_size - 1]) < EPSILSON) |
||||
|
grid_z_index = params.grid_z_size - 2; |
||||
|
else |
||||
|
grid_z_index = floor((z - grid_z[0]) / dz); |
||||
|
|
||||
|
TYPE_FLT output_data = 0; |
||||
|
if(grid_x_index >= 0 && grid_x_index < params.grid_x_size - 1 && |
||||
|
grid_z_index >= 0 && grid_z_index < params.grid_z_size - 1) |
||||
|
{ |
||||
|
//matrix simplification |
||||
|
TYPE_FLT a11 = grid_z[grid_z_index + 1] - z; |
||||
|
TYPE_FLT a12 = z - grid_z[grid_z_index]; |
||||
|
TYPE_FLT b11 = read_data(input_frame, grid_x_index, grid_z_index); |
||||
|
TYPE_FLT b12 = read_data(input_frame, grid_x_index + 1, grid_z_index); |
||||
|
TYPE_FLT b21 = read_data(input_frame, grid_x_index, grid_z_index + 1); |
||||
|
TYPE_FLT b22 = read_data(input_frame, grid_x_index + 1, grid_z_index + 1); |
||||
|
TYPE_FLT c11 = grid_x[grid_x_index + 1] - x; |
||||
|
TYPE_FLT c21 = x - grid_x[grid_x_index]; |
||||
|
|
||||
|
#ifdef TEST |
||||
|
if(gid.x == X && gid.y == Y) |
||||
|
{ |
||||
|
printf("dx: %.9f | ", dx); |
||||
|
printf("dz: %.9f | ", dz); |
||||
|
printf("x: %.9f | ", x); |
||||
|
printf("z: %.9f | ", z); |
||||
|
printf("grid_x_index: %d | ", grid_x_index); |
||||
|
printf("grid_z_index: %d | ", grid_z_index); |
||||
|
printf("a11: %.9f | ", a11); |
||||
|
printf("a12: %.9f | ", a12); |
||||
|
printf("b11: %.9f | ", b11); |
||||
|
printf("b12: %.9f | ", b12); |
||||
|
printf("b21: %.9f | ", b21); |
||||
|
printf("b22: %.9f | ", b22); |
||||
|
printf("c11: %.9f | ", c11); |
||||
|
printf("c21: %.9f | ", c21); |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
output_data = 1 / dx / dz * (c11 * (a11 * b11 + a12 * b21) + c21 * (a11 * b12 + a12 * b22)); |
||||
|
} |
||||
|
|
||||
|
TYPE_INT out = *((TYPE_INT*)(&output_data)); |
||||
|
uint4 pixel; |
||||
|
pixel.x = (TYPE_INT)(out & MASK); |
||||
|
pixel.y = (TYPE_INT)((out >> SHIFT) & MASK); |
||||
|
pixel.z = (TYPE_INT)((out >> (SHIFT *2)) & MASK); |
||||
|
pixel.w = (TYPE_INT)((out >> (SHIFT * 3)) & MASK); |
||||
|
|
||||
|
#ifdef TEST |
||||
|
if(gid.x == X && gid.y == Y) |
||||
|
{ |
||||
|
printf("out: %.15f | ", output_data); |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
write_imageui(output_frame, gid, pixel); |
||||
|
} |
||||
|
|
Loading…
Reference in new issue