From 7acb6ea5cdd445fa0290bf646097117c023cf3b5 Mon Sep 17 00:00:00 2001 From: Max Ehrlich Date: Tue, 17 Mar 2015 10:09:39 -0400 Subject: [PATCH] Added fillPoly function for drawing polygons --- src/Matrix.cc | 77 ++++++++++++++++++++++++++++++++++++++------------- src/Matrix.h | 1 + 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/src/Matrix.cc b/src/Matrix.cc index d378a63..149778b 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -38,6 +38,7 @@ Matrix::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(ctor, "ellipse", Ellipse); NODE_SET_PROTOTYPE_METHOD(ctor, "rectangle", Rectangle); NODE_SET_PROTOTYPE_METHOD(ctor, "line", Line); + NODE_SET_PROTOTYPE_METHOD(ctor, "fillPoly", FillPoly); NODE_SET_PROTOTYPE_METHOD(ctor, "save", Save); NODE_SET_PROTOTYPE_METHOD(ctor, "saveAsync", SaveAsync); NODE_SET_PROTOTYPE_METHOD(ctor, "resize", Resize); @@ -266,7 +267,7 @@ NAN_METHOD(Matrix::Set){ } else { NanThrowTypeError( "Invalid number of arguments" ); } - + NanReturnUndefined(); } @@ -283,9 +284,9 @@ NAN_METHOD(Matrix::Size){ NAN_METHOD(Matrix::Clone){ SETUP_FUNCTION(Matrix) - + Local im_h = NanNew(Matrix::constructor)->GetFunction()->NewInstance(); - + Matrix *m = ObjectWrap::Unwrap(im_h); m->mat = self->mat.clone(); @@ -451,7 +452,7 @@ NAN_METHOD(Matrix::ToBuffer){ Local buf = NanNewBufferHandle(vec.size()); uchar* data = (uchar*) Buffer::Data(buf); memcpy(data, &vec[0], vec.size()); - + v8::Local globalObj = NanGetCurrentContext()->Global(); v8::Local bufferConstructor = v8::Local::Cast(globalObj->Get(NanNew("Buffer"))); v8::Handle constructorArgs[3] = {buf, NanNew((unsigned)vec.size()), NanNew(0)}; @@ -470,21 +471,21 @@ class AsyncToBufferWorker : public NanAsyncWorker { void Execute () { std::vector vec(0); - + //std::vector params(0);//CV_IMWRITE_JPEG_QUALITY 90 cv::imencode(ext, this->matrix->mat, vec, this->params); - + res = vec; } void HandleOKCallback () { NanScope(); - + Local buf = NanNewBufferHandle(res.size()); uchar* data = (uchar*) Buffer::Data(buf); memcpy(data, &res[0], res.size()); - + v8::Local globalObj = NanGetCurrentContext()->Global(); v8::Local bufferConstructor = v8::Local::Cast(globalObj->Get(NanNew("Buffer"))); v8::Handle constructorArgs[3] = {buf, NanNew((unsigned)res.size()), NanNew(0)}; @@ -495,13 +496,13 @@ class AsyncToBufferWorker : public NanAsyncWorker { NanNull() , actualBuffer }; - + TryCatch try_catch; callback->Call(2, argv); if (try_catch.HasCaught()) { FatalException(try_catch); } - + } private: @@ -519,7 +520,7 @@ NAN_METHOD(Matrix::ToBufferAsync){ std::string ext = std::string(".jpg"); std::vector params; - + // See if the options argument is passed if ((args.Length() > 1) && (args[1]->IsObject())) { // Get this options argument @@ -539,14 +540,14 @@ NAN_METHOD(Matrix::ToBufferAsync){ int compression = options->Get(NanNew("pngCompression"))->IntegerValue(); params.push_back(CV_IMWRITE_PNG_COMPRESSION); params.push_back(compression); - } + } } - + NanCallback *callback = new NanCallback(cb.As()); NanAsyncQueueWorker(new AsyncToBufferWorker(callback, self, ext, params)); - + NanReturnUndefined(); } @@ -685,6 +686,42 @@ NAN_METHOD(Matrix::Line) { NanReturnNull(); } +NAN_METHOD(Matrix::FillPoly) { + SETUP_FUNCTION(Matrix) + + if(args[0]->IsArray()) + { + Local polyArray = Local::Cast(args[0]->ToObject()); + + cv::Point **polygons = new cv::Point*[polyArray->Length()]; + int *polySizes = new int[polyArray->Length()]; + for(unsigned int i = 0; i < polyArray->Length(); i++) + { + Local singlePoly = Local::Cast(polyArray->Get(i)->ToObject()); + polygons[i] = new cv::Point[singlePoly->Length()]; + polySizes[i] = singlePoly->Length(); + + for(unsigned int j = 0; j < singlePoly->Length(); j++) + { + Local point = Local::Cast(singlePoly->Get(j)->ToObject()); + polygons[i][j].x = point->Get(0)->IntegerValue(); + polygons[i][j].y = point->Get(1)->IntegerValue(); + } + } + + cv::Scalar color(0, 0, 255); + + if(args[1]->IsArray()) { + Local objColor = args[1]->ToObject(); + color = setColor(objColor); + } + + cv::fillPoly(self->mat, (const cv::Point **)polygons, polySizes, polyArray->Length(), color); + } + + NanReturnNull(); +} + NAN_METHOD(Matrix::Save) { SETUP_FUNCTION(Matrix) @@ -727,7 +764,7 @@ class AsyncSaveWorker : public NanAsyncWorker { NanNull() , NanNew(res) }; - + TryCatch try_catch; callback->Call(2, argv); if (try_catch.HasCaught()) { @@ -752,7 +789,7 @@ NAN_METHOD(Matrix::SaveAsync){ NanAsciiString filename(args[0]); REQ_FUN_ARG(1, cb); - + NanCallback *callback = new NanCallback(cb.As()); NanAsyncQueueWorker(new AsyncSaveWorker(callback, self, *filename)); @@ -1041,7 +1078,7 @@ NAN_METHOD(Matrix::BitwiseXor) { cv::bitwise_xor(src1->mat, src2->mat, self->mat, mask->mat); }else{ cv::bitwise_xor(src1->mat, src2->mat, self->mat); - } + } NanReturnNull(); } @@ -1058,7 +1095,7 @@ NAN_METHOD(Matrix::BitwiseNot) { cv::bitwise_not(self->mat, dst->mat, mask->mat); }else{ cv::bitwise_not(self->mat, dst->mat); - } + } NanReturnNull(); } @@ -1076,7 +1113,7 @@ NAN_METHOD(Matrix::BitwiseAnd) { cv::bitwise_and(src1->mat, src2->mat, self->mat, mask->mat); }else{ cv::bitwise_and(src1->mat, src2->mat, self->mat); - } + } NanReturnNull(); } @@ -1283,7 +1320,7 @@ NAN_METHOD(Matrix::HoughCircles) { equalizeHist(self->mat, gray); - + cv::HoughCircles(gray, circles, CV_HOUGH_GRADIENT, dp, minDist, higherThreshold, accumulatorThreshold, minRadius, maxRadius); v8::Local arr = NanNew(circles.size()); diff --git a/src/Matrix.h b/src/Matrix.h index 7ea1aa4..5461975 100755 --- a/src/Matrix.h +++ b/src/Matrix.h @@ -35,6 +35,7 @@ class Matrix: public node::ObjectWrap { JSFUNC(Rectangle) JSFUNC(Line) JSFUNC(Empty) + JSFUNC(FillPoly) JSFUNC(Save) JSFUNC(SaveAsync)