add shift image entry

Shifts an image by an integer number of pixels x or y directions, with
a BORDER_REPLICATE fill.  uses the underlying copymakeborder opencv call
This commit is contained in:
John Ludwig 2014-06-28 18:23:45 -07:00
parent 86560fd68b
commit d9bfdee231
2 changed files with 36 additions and 0 deletions

View File

@ -111,6 +111,7 @@ Matrix::Init(Handle<Object> target) {
NODE_SET_PROTOTYPE_METHOD(constructor, "copyWithMask", CopyWithMask); NODE_SET_PROTOTYPE_METHOD(constructor, "copyWithMask", CopyWithMask);
NODE_SET_PROTOTYPE_METHOD(constructor, "setWithMask", SetWithMask); NODE_SET_PROTOTYPE_METHOD(constructor, "setWithMask", SetWithMask);
NODE_SET_PROTOTYPE_METHOD(constructor, "meanWithMask", MeanWithMask); NODE_SET_PROTOTYPE_METHOD(constructor, "meanWithMask", MeanWithMask);
NODE_SET_PROTOTYPE_METHOD(constructor, "shift", Shift);
target->Set(String::NewSymbol("Matrix"), m->GetFunction()); target->Set(String::NewSymbol("Matrix"), m->GetFunction());
@ -1941,3 +1942,37 @@ Matrix::MeanWithMask(const v8::Arguments& args) {
return scope.Close(arr); return scope.Close(arr);
} }
Handle<Value>
Matrix::Shift(const v8::Arguments& args){
SETUP_FUNCTION(Matrix)
cv::Mat res;
double tx = args[0]->NumberValue();
double ty = args[1]->NumberValue();
// get the integer values of args
cv::Point2i deltai(ceil(tx), ceil(ty));
int fill=cv::BORDER_REPLICATE;
cv::Scalar value=cv::Scalar(0,0,0,0);
// INTEGER SHIFT
// first create a border around the parts of the Mat that will be exposed
int t = 0, b = 0, l = 0, r = 0;
if (deltai.x > 0) l = deltai.x;
if (deltai.x < 0) r = -deltai.x;
if (deltai.y > 0) t = deltai.y;
if (deltai.y < 0) b = -deltai.y;
cv::Mat padded;
cv::copyMakeBorder(self->mat, padded, t, b, l, r, fill, value);
// construct the region of interest around the new matrix
cv::Rect roi = cv::Rect(std::max(-deltai.x,0),std::max(-deltai.y,0),0,0) + self->mat.size();
res = padded(roi);
~self->mat;
self->mat = res;
return scope.Close(Undefined());
}

View File

@ -102,6 +102,7 @@ class Matrix: public node::ObjectWrap {
JSFUNC(CopyWithMask) JSFUNC(CopyWithMask)
JSFUNC(SetWithMask) JSFUNC(SetWithMask)
JSFUNC(MeanWithMask) JSFUNC(MeanWithMask)
JSFUNC(Shift)
/* /*
static Handle<Value> Val(const Arguments& args); static Handle<Value> Val(const Arguments& args);
static Handle<Value> RowRange(const Arguments& args); static Handle<Value> RowRange(const Arguments& args);