@webarkit/jsfeat-next
Version:
Typescript version of jsfeat for WebARKit
218 lines (214 loc) • 6.62 kB
text/typescript
export function _convol_u8(
buf: Int32Array | Float32Array,
src_d: number[],
dst_d: number[],
w: number,
h: number,
filter: Int32Array | Float32Array,
kernel_size: number,
half_kernel: number
) {
let i = 0,
j = 0,
k = 0,
sp = 0,
dp = 0,
sum = 0,
sum1 = 0,
sum2 = 0,
sum3 = 0,
f0 = filter[0],
fk = 0;
const w2 = w << 1,
w3 = w * 3,
w4 = w << 2;
// hor pass
for (; i < h; ++i) {
sum = src_d[sp];
for (j = 0; j < half_kernel; ++j) {
buf[j] = sum;
}
for (j = 0; j <= w - 2; j += 2) {
buf[j + half_kernel] = src_d[sp + j];
buf[j + half_kernel + 1] = src_d[sp + j + 1];
}
for (; j < w; ++j) {
buf[j + half_kernel] = src_d[sp + j];
}
sum = src_d[sp + w - 1];
for (j = w; j < half_kernel + w; ++j) {
buf[j + half_kernel] = sum;
}
for (j = 0; j <= w - 4; j += 4) {
(sum = buf[j] * f0), (sum1 = buf[j + 1] * f0), (sum2 = buf[j + 2] * f0), (sum3 = buf[j + 3] * f0);
for (k = 1; k < kernel_size; ++k) {
fk = filter[k];
sum += buf[k + j] * fk;
sum1 += buf[k + j + 1] * fk;
sum2 += buf[k + j + 2] * fk;
sum3 += buf[k + j + 3] * fk;
}
dst_d[dp + j] = Math.min(sum >> 8, 255);
dst_d[dp + j + 1] = Math.min(sum1 >> 8, 255);
dst_d[dp + j + 2] = Math.min(sum2 >> 8, 255);
dst_d[dp + j + 3] = Math.min(sum3 >> 8, 255);
}
for (; j < w; ++j) {
sum = buf[j] * f0;
for (k = 1; k < kernel_size; ++k) {
sum += buf[k + j] * filter[k];
}
dst_d[dp + j] = Math.min(sum >> 8, 255);
}
sp += w;
dp += w;
}
// vert pass
for (i = 0; i < w; ++i) {
sum = dst_d[i];
for (j = 0; j < half_kernel; ++j) {
buf[j] = sum;
}
k = i;
for (j = 0; j <= h - 2; j += 2, k += w2) {
buf[j + half_kernel] = dst_d[k];
buf[j + half_kernel + 1] = dst_d[k + w];
}
for (; j < h; ++j, k += w) {
buf[j + half_kernel] = dst_d[k];
}
sum = dst_d[(h - 1) * w + i];
for (j = h; j < half_kernel + h; ++j) {
buf[j + half_kernel] = sum;
}
dp = i;
for (j = 0; j <= h - 4; j += 4, dp += w4) {
(sum = buf[j] * f0), (sum1 = buf[j + 1] * f0), (sum2 = buf[j + 2] * f0), (sum3 = buf[j + 3] * f0);
for (k = 1; k < kernel_size; ++k) {
fk = filter[k];
sum += buf[k + j] * fk;
sum1 += buf[k + j + 1] * fk;
sum2 += buf[k + j + 2] * fk;
sum3 += buf[k + j + 3] * fk;
}
dst_d[dp] = Math.min(sum >> 8, 255);
dst_d[dp + w] = Math.min(sum1 >> 8, 255);
dst_d[dp + w2] = Math.min(sum2 >> 8, 255);
dst_d[dp + w3] = Math.min(sum3 >> 8, 255);
}
for (; j < h; ++j, dp += w) {
sum = buf[j] * f0;
for (k = 1; k < kernel_size; ++k) {
sum += buf[k + j] * filter[k];
}
dst_d[dp] = Math.min(sum >> 8, 255);
}
}
}
export function _convol(
buf: Int32Array | Float32Array,
src_d: number[],
dst_d: number[],
w: number,
h: number,
filter: Int32Array | Float32Array,
kernel_size: number,
half_kernel: number
) {
let i = 0,
j = 0,
k = 0,
sp = 0,
dp = 0,
sum = 0.0,
sum1 = 0.0,
sum2 = 0.0,
sum3 = 0.0,
f0 = filter[0],
fk = 0.0;
const w2 = w << 1,
w3 = w * 3,
w4 = w << 2;
// hor pass
for (; i < h; ++i) {
sum = src_d[sp];
for (j = 0; j < half_kernel; ++j) {
buf[j] = sum;
}
for (j = 0; j <= w - 2; j += 2) {
buf[j + half_kernel] = src_d[sp + j];
buf[j + half_kernel + 1] = src_d[sp + j + 1];
}
for (; j < w; ++j) {
buf[j + half_kernel] = src_d[sp + j];
}
sum = src_d[sp + w - 1];
for (j = w; j < half_kernel + w; ++j) {
buf[j + half_kernel] = sum;
}
for (j = 0; j <= w - 4; j += 4) {
(sum = buf[j] * f0), (sum1 = buf[j + 1] * f0), (sum2 = buf[j + 2] * f0), (sum3 = buf[j + 3] * f0);
for (k = 1; k < kernel_size; ++k) {
fk = filter[k];
sum += buf[k + j] * fk;
sum1 += buf[k + j + 1] * fk;
sum2 += buf[k + j + 2] * fk;
sum3 += buf[k + j + 3] * fk;
}
dst_d[dp + j] = sum;
dst_d[dp + j + 1] = sum1;
dst_d[dp + j + 2] = sum2;
dst_d[dp + j + 3] = sum3;
}
for (; j < w; ++j) {
sum = buf[j] * f0;
for (k = 1; k < kernel_size; ++k) {
sum += buf[k + j] * filter[k];
}
dst_d[dp + j] = sum;
}
sp += w;
dp += w;
}
// vert pass
for (i = 0; i < w; ++i) {
sum = dst_d[i];
for (j = 0; j < half_kernel; ++j) {
buf[j] = sum;
}
k = i;
for (j = 0; j <= h - 2; j += 2, k += w2) {
buf[j + half_kernel] = dst_d[k];
buf[j + half_kernel + 1] = dst_d[k + w];
}
for (; j < h; ++j, k += w) {
buf[j + half_kernel] = dst_d[k];
}
sum = dst_d[(h - 1) * w + i];
for (j = h; j < half_kernel + h; ++j) {
buf[j + half_kernel] = sum;
}
dp = i;
for (j = 0; j <= h - 4; j += 4, dp += w4) {
(sum = buf[j] * f0), (sum1 = buf[j + 1] * f0), (sum2 = buf[j + 2] * f0), (sum3 = buf[j + 3] * f0);
for (k = 1; k < kernel_size; ++k) {
fk = filter[k];
sum += buf[k + j] * fk;
sum1 += buf[k + j + 1] * fk;
sum2 += buf[k + j + 2] * fk;
sum3 += buf[k + j + 3] * fk;
}
dst_d[dp] = sum;
dst_d[dp + w] = sum1;
dst_d[dp + w2] = sum2;
dst_d[dp + w3] = sum3;
}
for (; j < h; ++j, dp += w) {
sum = buf[j] * f0;
for (k = 1; k < kernel_size; ++k) {
sum += buf[k + j] * filter[k];
}
dst_d[dp] = sum;
}
}
}