sono
5 years ago
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