Skip to content
Snippets Groups Projects

Use 5x5 proper census for SGM

Merged Nicolas Pope requested to merge exp/ct5 into master
1 file
+ 11
29
Compare changes
  • Side-by-side
  • Inline
@@ -116,43 +116,25 @@ __global__ void census_transform_kernel(
static constexpr int RADIUS_Y = WINDOW_HEIGHT/2;
const int x = (blockIdx.x*blockDim.x + threadIdx.x);
const int y = blockIdx.y*blockDim.y + threadIdx.y;
const int y = blockIdx.y*blockDim.y + threadIdx.y;
dest[x+y*width] = 0;
feature_type res = 0;
if (x >= RADIUS_X && y >= RADIUS_Y && x < width-RADIUS_X && y < height-RADIUS_Y) {
short center = src[y*pitch+x];
uint8_t i = 0; // bit counter for *out
// possible BUG in operator(), gets called more than once per pixel;
// local variable for sub-bitstring to avoid data race (no read
// dependency to out; writes are identical)
feature_type res = 0;
for (int wy = -RADIUS_Y; wy <= RADIUS_Y; wy++) {
for (int wx = -RADIUS_X; wx <= RADIUS_X; wx++) {
const int y_ = y + wy;
const int x_ = x + wx;
if (y == 0 && x == 0) {
continue;
}
const T center = src[y*pitch+x];
// zero if first value, otherwise shift to left
res = (res << 1);
res |= (center < (src[y_*pitch+x_]) ? 1 : 0);
#pragma unroll
for (int wy = -RADIUS_Y; wy <= RADIUS_Y; ++wy) {
const int i = (y + wy) * pitch + x;
// if all bits set, continue to next element
/*if (++i % 64 == 0) {
*out = res;
out++;
}*/
#pragma unroll
for (int wx = -RADIUS_X; wx <= RADIUS_X; ++wx) {
res = (res << 1) | (center < (src[i+wx]) ? 1 : 0);
}
}
//if ((i - 1)%64 != 0) {
// write remaining bits
dest[x+y*width] = res;
//}
}
dest[x+y*width] = res;
}
template <typename T>
Loading