mirror of
https://github.com/peterbraden/node-opencv.git
synced 2025-12-08 19:45:55 +00:00
Merge pull request #129 from jhludwig/warptransform
Warp Perspective Transform
This commit is contained in:
commit
fee6a05f9e
23
examples/warp_image.js
Normal file
23
examples/warp_image.js
Normal file
@ -0,0 +1,23 @@
|
||||
var cv = require('../lib/opencv');
|
||||
|
||||
cv.readImage("./mona.png", function(err, im) {
|
||||
|
||||
var srcArray = [
|
||||
0,0,
|
||||
im.width(),0,
|
||||
im.width(),im.height(),
|
||||
0,im.height()];
|
||||
var dstArray = [
|
||||
0,0,
|
||||
im.width()*.9,im.height()*.1,
|
||||
im.width(),im.height(),
|
||||
im.width()*.2,im.height()*.8];
|
||||
|
||||
var xfrmMat = im.getPerspectiveTransform(srcArray,dstArray);
|
||||
img_warp = im.copy();
|
||||
img_warp.warpPerspective(xfrmMat,im.width,im.height,[255,255,255]);
|
||||
|
||||
img_warp.save("/tmp/mona_warp.png");
|
||||
|
||||
});
|
||||
|
||||
@ -101,6 +101,9 @@ Matrix::Init(Handle<Object> target) {
|
||||
|
||||
NODE_SET_PROTOTYPE_METHOD(constructor, "putText", PutText);
|
||||
|
||||
NODE_SET_PROTOTYPE_METHOD(constructor, "getPerspectiveTransform", GetPerspectiveTransform);
|
||||
NODE_SET_PROTOTYPE_METHOD(constructor, "warpPerspective", WarpPerspective);
|
||||
|
||||
NODE_SET_METHOD(constructor, "Eye", Eye);
|
||||
|
||||
|
||||
@ -1756,3 +1759,54 @@ Matrix::PutText(const v8::Arguments& args) {
|
||||
|
||||
return scope.Close(Undefined());
|
||||
}
|
||||
|
||||
Handle<Value>
|
||||
Matrix::GetPerspectiveTransform(const v8::Arguments& args) {
|
||||
HandleScope scope;
|
||||
|
||||
// extract quad args
|
||||
Local<Object> srcArray = args[0]->ToObject();
|
||||
Local<Object> tgtArray = args[1]->ToObject();
|
||||
|
||||
std::vector<cv::Point2f> src_corners(4);
|
||||
std::vector<cv::Point2f> tgt_corners(4);
|
||||
for (unsigned int i = 0; i < 4; i++) {
|
||||
src_corners[i] = cvPoint(srcArray->Get(i*2)->IntegerValue(),srcArray->Get(i*2+1)->IntegerValue());
|
||||
tgt_corners[i] = cvPoint(tgtArray->Get(i*2)->IntegerValue(),tgtArray->Get(i*2+1)->IntegerValue());
|
||||
}
|
||||
|
||||
Local<Object> xfrm = Matrix::constructor->GetFunction()->NewInstance();
|
||||
Matrix *xfrmmat = ObjectWrap::Unwrap<Matrix>(xfrm);
|
||||
xfrmmat->mat = cv::getPerspectiveTransform(src_corners, tgt_corners);
|
||||
|
||||
return scope.Close(xfrm);
|
||||
}
|
||||
|
||||
Handle<Value>
|
||||
Matrix::WarpPerspective(const v8::Arguments& args) {
|
||||
SETUP_FUNCTION(Matrix)
|
||||
|
||||
Matrix *xfrm = ObjectWrap::Unwrap<Matrix>(args[0]->ToObject());
|
||||
|
||||
int width = args[1]->IntegerValue();
|
||||
int height = args[2]->IntegerValue();
|
||||
|
||||
int flags = cv::INTER_LINEAR;
|
||||
int borderMode = cv::BORDER_REPLICATE;
|
||||
|
||||
cv::Scalar borderColor(0, 0, 255);
|
||||
|
||||
if(args[3]->IsArray()) {
|
||||
Local<Object> objColor = args[3]->ToObject();
|
||||
borderColor = setColor(objColor);
|
||||
}
|
||||
|
||||
cv::Mat res = cv::Mat(width, height, CV_32FC3);
|
||||
|
||||
cv::warpPerspective(self->mat, res, xfrm->mat, cv::Size(width, height), flags, borderMode, borderColor);
|
||||
|
||||
~self->mat;
|
||||
self->mat = res;
|
||||
|
||||
return scope.Close(v8::Null());
|
||||
}
|
||||
|
||||
@ -94,6 +94,8 @@ class Matrix: public node::ObjectWrap {
|
||||
JSFUNC(PushBack)
|
||||
|
||||
JSFUNC(PutText)
|
||||
JSFUNC(GetPerspectiveTransform)
|
||||
JSFUNC(WarpPerspective)
|
||||
/*
|
||||
static Handle<Value> Val(const Arguments& args);
|
||||
static Handle<Value> RowRange(const Arguments& args);
|
||||
@ -121,7 +123,8 @@ class Matrix: public node::ObjectWrap {
|
||||
static Handle<Value> Depth(const Arguments& args);
|
||||
static Handle<Value> Channels(const Arguments& args);
|
||||
static Handle<Value> StepOne(const Arguments& args);
|
||||
|
||||
static Handle<Value> GetPerspectiveTransform(const Arguments& args);
|
||||
static Handle<Value> WarpPerspective(const Arguments& args);
|
||||
|
||||
*/
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user