Skip to content

Commit

Permalink
fix API flows
Browse files Browse the repository at this point in the history
  • Loading branch information
inspirit committed Sep 2, 2014
1 parent a3ed1b4 commit 01edb0f
Show file tree
Hide file tree
Showing 4 changed files with 154 additions and 48 deletions.
2 changes: 1 addition & 1 deletion build/jsfeat-min.js

Large diffs are not rendered by default.

116 changes: 86 additions & 30 deletions build/jsfeat.js
Expand Up @@ -49,6 +49,12 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
}
})();

// color conversion
var COLOR_RGBA2GRAY = 0;
var COLOR_RGB2GRAY = 1;
var COLOR_BGRA2GRAY = 2;
var COLOR_BGR2GRAY = 3;

// box blur option
var BOX_BLUR_NOSCALE = 0x01;
// svd options
Expand Down Expand Up @@ -111,9 +117,9 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
}
matrix_t.prototype.resize = function(c, r, ch) {
if (typeof ch === "undefined") { ch = this.channel; }
// change buffer only if new size doesnt fit
var new_size = (c * ch) * r;
if(new_size > this.rows*this.cols*this.channel) {
// relocate buffer only if new size doesnt fit
var new_size = (c * get_data_type_size(this.type) * ch) * r;
if(new_size > this.buffer.size) {
this.cols = c;
this.rows = r;
this.channel = ch;
Expand Down Expand Up @@ -165,8 +171,8 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
return pyramid_t;
})();

var point2d_t = (function () {
function point2d_t(x,y,score,level,angle) {
var keypoint_t = (function () {
function keypoint_t(x,y,score,level,angle) {
if (typeof x === "undefined") { x=0; }
if (typeof y === "undefined") { y=0; }
if (typeof score === "undefined") { score=0; }
Expand All @@ -179,7 +185,7 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
this.level = level;
this.angle = angle;
}
return point2d_t;
return keypoint_t;
})();


Expand Down Expand Up @@ -209,6 +215,12 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
global.EPSILON = EPSILON;
global.FLT_MIN = FLT_MIN;

// color convert
global.COLOR_RGBA2GRAY = COLOR_RGBA2GRAY;
global.COLOR_RGB2GRAY = COLOR_RGB2GRAY;
global.COLOR_BGRA2GRAY = COLOR_BGRA2GRAY;
global.COLOR_BGR2GRAY = COLOR_BGR2GRAY;

// options
global.BOX_BLUR_NOSCALE = BOX_BLUR_NOSCALE;
global.SVD_U_T = SVD_U_T;
Expand All @@ -221,7 +233,7 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
global.data_t = data_t;
global.matrix_t = matrix_t;
global.pyramid_t = pyramid_t;
global.point2d_t = point2d_t;
global.keypoint_t = keypoint_t;

})(jsfeat);
/**
Expand Down Expand Up @@ -2672,25 +2684,41 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
return {
// TODO: add support for RGB/BGR order
// for raw arrays
grayscale: function(src, dst) {
var srcLength = src.length|0, srcLength_16 = (srcLength - 16)|0;
var j = 0;
var coeff_r = 4899, coeff_g = 9617, coeff_b = 1868;

for (var i = 0; i <= srcLength_16; i += 16, j += 4) {
dst[j] = (src[i] * coeff_r + src[i+1] * coeff_g + src[i+2] * coeff_b + 8192) >> 14;
dst[j + 1] = (src[i+4] * coeff_r + src[i+5] * coeff_g + src[i+6] * coeff_b + 8192) >> 14;
dst[j + 2] = (src[i+8] * coeff_r + src[i+9] * coeff_g + src[i+10] * coeff_b + 8192) >> 14;
dst[j + 3] = (src[i+12] * coeff_r + src[i+13] * coeff_g + src[i+14] * coeff_b + 8192) >> 14;
grayscale: function(src, w, h, dst, code) {
// this is default image data representation in browser
if (typeof code === "undefined") { code = jsfeat.COLOR_RGBA2GRAY; }
var x=0, y=0, i=0, j=0, ir=0,jr=0;
var coeff_r = 4899, coeff_g = 9617, coeff_b = 1868, cn = 4;

if(code == jsfeat.COLOR_BGRA2GRAY || code == jsfeat.COLOR_BGR2GRAY) {
coeff_r = 1868;
coeff_b = 4899;
}
for (; i < srcLength; i += 4, ++j) {
dst[j] = (src[i] * coeff_r + src[i+1] * coeff_g + src[i+2] * coeff_b + 8192) >> 14;
if(code == jsfeat.COLOR_RGB2GRAY || code == jsfeat.COLOR_BGR2GRAY) {
cn = 3;
}
var cn2 = cn<<1, cn3 = (cn*3)|0;

dst.resize(w, h, 1);
var dst_u8 = dst.data;

for(y = 0; y < h; ++y, j+=w, i+=w*cn) {
for(x = 0, ir = i, jr = j; x <= w-4; x+=4, ir+=cn<<2, jr+=4) {
dst_u8[jr] = (src[ir] * coeff_r + src[ir+1] * coeff_g + src[ir+2] * coeff_b + 8192) >> 14;
dst_u8[jr + 1] = (src[ir+cn] * coeff_r + src[ir+cn+1] * coeff_g + src[ir+cn+2] * coeff_b + 8192) >> 14;
dst_u8[jr + 2] = (src[ir+cn2] * coeff_r + src[ir+cn2+1] * coeff_g + src[ir+cn2+2] * coeff_b + 8192) >> 14;
dst_u8[jr + 3] = (src[ir+cn3] * coeff_r + src[ir+cn3+1] * coeff_g + src[ir+cn3+2] * coeff_b + 8192) >> 14;
}
for (; x < w; ++x, ++jr, ir+=cn) {
dst_u8[jr] = (src[ir] * coeff_r + src[ir+1] * coeff_g + src[ir+2] * coeff_b + 8192) >> 14;
}
}
},
// derived from CCV library
resample: function(src, dst, nw, nh) {
var h=src.rows,w=src.cols;
if (h > nh && w > nw) {
dst.resize(nw, nh, src.channel);
// using the fast alternative (fix point scale, 0x100 to avoid overflow)
if (src.type&jsfeat.U8_t && dst.type&jsfeat.U8_t && h * w / (nh * nw) < 0x100) {
_resample_u8(src, dst, nw, nh);
Expand All @@ -2715,6 +2743,8 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
var data_u8 = src.data;
var hold=0;

dst.resize(w, h, src.channel);

// first pass
// no need to scale
//data_u8 = src.data;
Expand Down Expand Up @@ -2872,6 +2902,9 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
var half_kernel = kernel_size >> 1;
var w = src.cols, h = src.rows;
var data_type = src.type, is_u8 = data_type&jsfeat.U8_t;

dst.resize(w, h, src.channel);

var src_d = src.data, dst_d = dst.data;
var buf,filter,buf_sz=(kernel_size + Math.max(h, w))|0;

Expand Down Expand Up @@ -2910,6 +2943,9 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
var w2 = w >> 1, h2 = h >> 1;
var _w2 = w2 - (sx << 1), _h2 = h2 - (sy << 1);
var x=0,y=0,sptr=sx+sy*w,sline=0,dptr=0,dline=0;

dst.resize(w2, h2, src.channel);

var src_d = src.data, dst_d = dst.data;

for(y = 0; y < _h2; ++y) {
Expand All @@ -2936,6 +2972,9 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
var dstep = w<<1,x=0,y=0,x1=0,a,b,c,d,e,f;
var srow0=0,srow1=0,srow2=0,drow=0;
var trow0,trow1;

dst.resize(w, h, 2); // 2 channel output gx, gy

var img = src.data, gxgy=dst.data;

var buf0_node = jsfeat.cache.get_buffer((w+2)<<2);
Expand Down Expand Up @@ -3002,6 +3041,9 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
var dstep = w<<1,x=0,y=0,x1=0,a,b,c,d,e,f;
var srow0=0,srow1=0,srow2=0,drow=0;
var trow0,trow1;

dst.resize(w, h, 2); // 2 channel output gx, gy

var img = src.data, gxgy=dst.data;

var buf0_node = jsfeat.cache.get_buffer((w+2)<<2);
Expand Down Expand Up @@ -3168,7 +3210,11 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
}
},
equalize_histogram: function(src, dst) {
var w=src.cols,h=src.rows,src_d=src.data,dst_d=dst.data,size=w*h;
var w=src.cols,h=src.rows,src_d=src.data;

dst.resize(w, h, src.channel);

var dst_d=dst.data,size=w*h;
var i=0,prev=0,hist0,norm;

var hist0_node = jsfeat.cache.get_buffer(256<<2);
Expand All @@ -3191,7 +3237,11 @@ var jsfeat = jsfeat || { REVISION: 'ALPHA' };
},

canny: function(src, dst, low_thresh, high_thresh) {
var w=src.cols,h=src.rows,src_d=src.data,dst_d=dst.data;
var w=src.cols,h=src.rows,src_d=src.data;

dst.resize(w, h, src.channel);

var dst_d=dst.data;
var i=0,j=0,grad=0,w2=w<<1,_grad=0,suppress=0,f=0,x=0,y=0,s=0;
var tg22x=0,tg67x=0;

Expand Down Expand Up @@ -3709,11 +3759,11 @@ The references are:

var yape06 = (function() {

var compute_laplacian = function(src, dst, w, h, Dxx, Dyy) {
var y=0,x=0,yrow=(Dxx*w+Dxx)|0,row=yrow;
var compute_laplacian = function(src, dst, w, h, Dxx, Dyy, sx,sy, ex,ey) {
var y=0,x=0,yrow=(sy*w+sx)|0,row=yrow;

for(y = Dxx; y < h - Dxx; ++y, yrow+=w, row = yrow) {
for(x = Dxx; x < w - Dxx; ++x, ++row) {
for(y = sy; y < ey; ++y, yrow+=w, row = yrow) {
for(x = sx; x < ex; ++x, ++row) {
dst[row] = -4 * src[row] + src[row+Dxx] + src[row-Dxx] + src[row+Dyy] + src[row-Dyy];
}
}
Expand All @@ -3733,7 +3783,8 @@ The references are:
laplacian_threshold: 30,
min_eigen_value_threshold: 25,

detect: function(src, points) {
detect: function(src, points, border) {
if (typeof border === "undefined") { border = 5; }
var x=0,y=0;
var w=src.cols, h=src.rows, srd_d=src.data;
var Dxx = 5, Dyy = (5 * w)|0;
Expand All @@ -3745,13 +3796,18 @@ The references are:
var lap_thresh = this.laplacian_threshold;
var eigen_thresh = this.min_eigen_value_threshold;

var sx = Math.max(5, border)|0;
var sy = Math.max(3, border)|0;
var ex = Math.min(w-5, w-border)|0;
var ey = Math.min(h-3, h-border)|0;

x = w*h;
while(--x>=0) {laplacian[x]=0;}
compute_laplacian(srd_d, laplacian, w, h, Dxx, Dyy);
compute_laplacian(srd_d, laplacian, w, h, Dxx, Dyy, sx,sy, ex,ey);

row = (Dxx*w+Dxx)|0;
for(y = Dxx; y < h-Dxx; ++y, row += w) {
for(x = Dxx, rowx=row; x < w-Dxx; ++x, ++rowx) {
row = (sy*w+sx)|0;
for(y = sy; y < ey; ++y, row += w) {
for(x = sx, rowx=row; x < ex; ++x, ++rowx) {

lv = laplacian[rowx];
if ((lv < -lap_thresh &&
Expand Down
66 changes: 52 additions & 14 deletions src/jsfeat_imgproc.js
Expand Up @@ -372,25 +372,41 @@
return {
// TODO: add support for RGB/BGR order
// for raw arrays
grayscale: function(src, dst) {
var srcLength = src.length|0, srcLength_16 = (srcLength - 16)|0;
var j = 0;
var coeff_r = 4899, coeff_g = 9617, coeff_b = 1868;

for (var i = 0; i <= srcLength_16; i += 16, j += 4) {
dst[j] = (src[i] * coeff_r + src[i+1] * coeff_g + src[i+2] * coeff_b + 8192) >> 14;
dst[j + 1] = (src[i+4] * coeff_r + src[i+5] * coeff_g + src[i+6] * coeff_b + 8192) >> 14;
dst[j + 2] = (src[i+8] * coeff_r + src[i+9] * coeff_g + src[i+10] * coeff_b + 8192) >> 14;
dst[j + 3] = (src[i+12] * coeff_r + src[i+13] * coeff_g + src[i+14] * coeff_b + 8192) >> 14;
grayscale: function(src, w, h, dst, code) {
// this is default image data representation in browser
if (typeof code === "undefined") { code = jsfeat.COLOR_RGBA2GRAY; }
var x=0, y=0, i=0, j=0, ir=0,jr=0;
var coeff_r = 4899, coeff_g = 9617, coeff_b = 1868, cn = 4;

if(code == jsfeat.COLOR_BGRA2GRAY || code == jsfeat.COLOR_BGR2GRAY) {
coeff_r = 1868;
coeff_b = 4899;
}
for (; i < srcLength; i += 4, ++j) {
dst[j] = (src[i] * coeff_r + src[i+1] * coeff_g + src[i+2] * coeff_b + 8192) >> 14;
if(code == jsfeat.COLOR_RGB2GRAY || code == jsfeat.COLOR_BGR2GRAY) {
cn = 3;
}
var cn2 = cn<<1, cn3 = (cn*3)|0;

dst.resize(w, h, 1);
var dst_u8 = dst.data;

for(y = 0; y < h; ++y, j+=w, i+=w*cn) {
for(x = 0, ir = i, jr = j; x <= w-4; x+=4, ir+=cn<<2, jr+=4) {
dst_u8[jr] = (src[ir] * coeff_r + src[ir+1] * coeff_g + src[ir+2] * coeff_b + 8192) >> 14;
dst_u8[jr + 1] = (src[ir+cn] * coeff_r + src[ir+cn+1] * coeff_g + src[ir+cn+2] * coeff_b + 8192) >> 14;
dst_u8[jr + 2] = (src[ir+cn2] * coeff_r + src[ir+cn2+1] * coeff_g + src[ir+cn2+2] * coeff_b + 8192) >> 14;
dst_u8[jr + 3] = (src[ir+cn3] * coeff_r + src[ir+cn3+1] * coeff_g + src[ir+cn3+2] * coeff_b + 8192) >> 14;
}
for (; x < w; ++x, ++jr, ir+=cn) {
dst_u8[jr] = (src[ir] * coeff_r + src[ir+1] * coeff_g + src[ir+2] * coeff_b + 8192) >> 14;
}
}
},
// derived from CCV library
resample: function(src, dst, nw, nh) {
var h=src.rows,w=src.cols;
if (h > nh && w > nw) {
dst.resize(nw, nh, src.channel);
// using the fast alternative (fix point scale, 0x100 to avoid overflow)
if (src.type&jsfeat.U8_t && dst.type&jsfeat.U8_t && h * w / (nh * nw) < 0x100) {
_resample_u8(src, dst, nw, nh);
Expand All @@ -415,6 +431,8 @@
var data_u8 = src.data;
var hold=0;

dst.resize(w, h, src.channel);

// first pass
// no need to scale
//data_u8 = src.data;
Expand Down Expand Up @@ -572,6 +590,9 @@
var half_kernel = kernel_size >> 1;
var w = src.cols, h = src.rows;
var data_type = src.type, is_u8 = data_type&jsfeat.U8_t;

dst.resize(w, h, src.channel);

var src_d = src.data, dst_d = dst.data;
var buf,filter,buf_sz=(kernel_size + Math.max(h, w))|0;

Expand Down Expand Up @@ -610,6 +631,9 @@
var w2 = w >> 1, h2 = h >> 1;
var _w2 = w2 - (sx << 1), _h2 = h2 - (sy << 1);
var x=0,y=0,sptr=sx+sy*w,sline=0,dptr=0,dline=0;

dst.resize(w2, h2, src.channel);

var src_d = src.data, dst_d = dst.data;

for(y = 0; y < _h2; ++y) {
Expand All @@ -636,6 +660,9 @@
var dstep = w<<1,x=0,y=0,x1=0,a,b,c,d,e,f;
var srow0=0,srow1=0,srow2=0,drow=0;
var trow0,trow1;

dst.resize(w, h, 2); // 2 channel output gx, gy

var img = src.data, gxgy=dst.data;

var buf0_node = jsfeat.cache.get_buffer((w+2)<<2);
Expand Down Expand Up @@ -702,6 +729,9 @@
var dstep = w<<1,x=0,y=0,x1=0,a,b,c,d,e,f;
var srow0=0,srow1=0,srow2=0,drow=0;
var trow0,trow1;

dst.resize(w, h, 2); // 2 channel output gx, gy

var img = src.data, gxgy=dst.data;

var buf0_node = jsfeat.cache.get_buffer((w+2)<<2);
Expand Down Expand Up @@ -868,7 +898,11 @@
}
},
equalize_histogram: function(src, dst) {
var w=src.cols,h=src.rows,src_d=src.data,dst_d=dst.data,size=w*h;
var w=src.cols,h=src.rows,src_d=src.data;

dst.resize(w, h, src.channel);

var dst_d=dst.data,size=w*h;
var i=0,prev=0,hist0,norm;

var hist0_node = jsfeat.cache.get_buffer(256<<2);
Expand All @@ -891,7 +925,11 @@
},

canny: function(src, dst, low_thresh, high_thresh) {
var w=src.cols,h=src.rows,src_d=src.data,dst_d=dst.data;
var w=src.cols,h=src.rows,src_d=src.data;

dst.resize(w, h, src.channel);

var dst_d=dst.data;
var i=0,j=0,grad=0,w2=w<<1,_grad=0,suppress=0,f=0,x=0,y=0,s=0;
var tg22x=0,tg67x=0;

Expand Down

0 comments on commit 01edb0f

Please sign in to comment.