From f02ec18e2bdc1a3bc26f560820451e4410739ecc Mon Sep 17 00:00:00 2001 From: Peter Braden Date: Fri, 20 Jan 2012 12:47:21 -0800 Subject: [PATCH] WIP on images and buffers --- smoketest.js | 6 +++--- src/Image.cc | 39 ++++++++++++++++++++++++++------------- src/Image.h | 2 ++ test/smoke.js | 7 ++++++- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/smoketest.js b/smoketest.js index 5e70628..246f597 100755 --- a/smoketest.js +++ b/smoketest.js @@ -4,9 +4,9 @@ var cv = require('./lib/opencv') console.log(cv.version) //console.log(cv.Image.prototype); -/* -var im = new cv.Image("./examples/test.jpg") + +var im = new cv.Image("./examples/t2.jpg") , face_cascade = new cv.CascadeClassifier("./examples/haarcascade_frontalface_alt.xml") var faces = face_cascade.detectMultiScale(im, function(err, faces){ @@ -17,4 +17,4 @@ var faces = face_cascade.detectMultiScale(im, function(err, faces){ im.save('./out.jpg'); -});*/ \ No newline at end of file +}); \ No newline at end of file diff --git a/src/Image.cc b/src/Image.cc index 300b0d5..daa2ba6 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -26,6 +26,8 @@ Image::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(constructor, "save", Save); NODE_SET_PROTOTYPE_METHOD(constructor, "ellipse", Ellipse); + NODE_SET_PROTOTYPE_METHOD(constructor, "toBuffer", ToBuffer); + target->Set(String::NewSymbol("Image"), t->GetFunction()); @@ -52,17 +54,18 @@ Image::New(const Arguments &args) { width = args[0]->Uint32Value(); height = args[1]->Uint32Value(); img = new Image(width, height); - } else { - if (args[0]->IsString()) { - img = new Image(*args[0]); - } else { - if (Buffer::HasInstance(args[0])){ - uint8_t *buf = (uint8_t *) Buffer::Data(args[0]->ToObject()); - unsigned len = Buffer::Length(args[0]->ToObject()); - img = new Image(buf, len); - } - } - } + } else if (args[0]->IsString()) { + img = new Image(*args[0]); + } else if (Buffer::HasInstance(args[0])){ + uint8_t *buf = (uint8_t *) Buffer::Data(args[0]->ToObject()); + unsigned len = Buffer::Length(args[0]->ToObject()); + img = new Image(buf, len); + + if (img->mat.empty()){ + return v8::ThrowException(v8::Exception::TypeError(v8::String::New("Error loading file"))); + } + } + img->Wrap(args.This()); return args.This(); @@ -75,8 +78,7 @@ Image::Image(int width, int height): ObjectWrap() { Image::Image(uint8_t* buf, unsigned len): ObjectWrap() { - cv::Mat *mbuf = new cv::Mat(len, 1, CV_8UC1); - + cv::Mat *mbuf = new cv::Mat(len, 1, CV_8UC1, buf); mat = cv::imdecode(*mbuf, -1); }; @@ -119,6 +121,17 @@ Image::Save(const v8::Arguments& args){ } +Handle +Image::ToBuffer(const v8::Arguments& args){ + HandleScope scope; + //Buffer *buf = Buffer::New(mat->length); + //cv::imencode('.jpg', mat, vec, CV_IMWRITE_JPEG_QUALITY 90) + + return scope.Close(Number::New(0)); +} + + + // ellipse(x, y, wid, height, angle, startangle, endangle, color, thickness, linetype, shift) Handle Image::Ellipse(const v8::Arguments& args){ diff --git a/src/Image.h b/src/Image.h index 7b9222c..7753fb1 100644 --- a/src/Image.h +++ b/src/Image.h @@ -19,6 +19,8 @@ class Image: public node::ObjectWrap { static Handle Save(const v8::Arguments&); static Handle Ellipse(const v8::Arguments&); + static Handle ToBuffer(const v8::Arguments&); + private: ~Image(); }; diff --git a/test/smoke.js b/test/smoke.js index 98d5b5a..33d6b74 100644 --- a/test/smoke.js +++ b/test/smoke.js @@ -83,8 +83,13 @@ vows.describe('Smoke Tests OpenCV').addBatch({ } , "constructor(buffer)" : function(cv){ - assert.ok(new cv.Image(fs.readFileSync('./examples/mona.jpg'))); + var im = new cv.Image(fs.readFileSync('./examples/mona.jpg')) + assert.ok(im); + assert.equal(im.width, 500); + assert.equal(im.height, 756) + assert.equal(im.empty(), false) } + , "inherits from matrix": function(cv){ assert.equal(new cv.Image("./examples/mona.jpg").empty(), false)