diff --git a/src/Matrix.cc b/src/Matrix.cc index 4978953..4e97c64 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -68,6 +68,7 @@ Matrix::Init(Handle target) { NODE_SET_PROTOTYPE_METHOD(ctor, "drawAllContours", DrawAllContours); NODE_SET_PROTOTYPE_METHOD(ctor, "goodFeaturesToTrack", GoodFeaturesToTrack); NODE_SET_PROTOTYPE_METHOD(ctor, "houghLinesP", HoughLinesP); + NODE_SET_PROTOTYPE_METHOD(ctor, "houghCircles", HoughCircles); NODE_SET_PROTOTYPE_METHOD(ctor, "inRange", inRange); NODE_SET_PROTOTYPE_METHOD(ctor, "adjustROI", AdjustROI); NODE_SET_PROTOTYPE_METHOD(ctor, "locateROI", LocateROI); @@ -1027,7 +1028,12 @@ NAN_METHOD(Matrix::BitwiseXor) { Matrix *src1 = ObjectWrap::Unwrap(args[0]->ToObject()); Matrix *src2 = ObjectWrap::Unwrap(args[1]->ToObject()); - cv::bitwise_xor(src1->mat, src2->mat, self->mat); + if(args.Length() == 3){ + Matrix *mask = ObjectWrap::Unwrap(args[2]->ToObject()); + cv::bitwise_xor(src1->mat, src2->mat, self->mat, mask->mat); + }else{ + cv::bitwise_xor(src1->mat, src2->mat, self->mat); + } NanReturnNull(); } @@ -1039,7 +1045,12 @@ NAN_METHOD(Matrix::BitwiseNot) { Matrix *dst = ObjectWrap::Unwrap(args[0]->ToObject()); - cv::bitwise_not(self->mat, dst->mat); + if(args.Length() == 2){ + Matrix *mask = ObjectWrap::Unwrap(args[1]->ToObject()); + cv::bitwise_not(self->mat, dst->mat, mask->mat); + }else{ + cv::bitwise_not(self->mat, dst->mat); + } NanReturnNull(); } @@ -1052,7 +1063,12 @@ NAN_METHOD(Matrix::BitwiseAnd) { Matrix *src1 = ObjectWrap::Unwrap(args[0]->ToObject()); Matrix *src2 = ObjectWrap::Unwrap(args[1]->ToObject()); - cv::bitwise_and(src1->mat, src2->mat, self->mat); + if(args.Length() == 3){ + Matrix *mask = ObjectWrap::Unwrap(args[2]->ToObject()); + cv::bitwise_and(src1->mat, src2->mat, self->mat, mask->mat); + }else{ + cv::bitwise_and(src1->mat, src2->mat, self->mat); + } NanReturnNull(); } @@ -1125,7 +1141,11 @@ NAN_METHOD(Matrix::FindContours) { if (args[1]->IsNumber()) chain = args[1]->IntegerValue(); } + Matrix *self = ObjectWrap::Unwrap(args.This()); Local conts_to_return= NanNew(Contour::constructor)->GetFunction()->NewInstance(); + Contour *contours = ObjectWrap::Unwrap(conts_to_return); + + cv::findContours(self->mat, contours->contours, contours->hierarchy, mode, chain); NanReturnValue(conts_to_return); @@ -1238,6 +1258,41 @@ NAN_METHOD(Matrix::HoughLinesP) { } +NAN_METHOD(Matrix::HoughCircles) { + NanScope(); + + Matrix *self = ObjectWrap::Unwrap(args.This()); + + double dp = args.Length() < 1 ? 1 : args[0]->NumberValue(); + double minDist = args.Length() < 2 ? 1 : args[1]->NumberValue(); + double higherThreshold = args.Length() < 3 ? 100 : args[2]->NumberValue(); + double accumulatorThreshold = args.Length() < 4 ? 100 : args[3]->NumberValue(); + int minRadius = args.Length() < 5 ? 0 : args[4]->Uint32Value(); + int maxRadius = args.Length() < 6 ? 0 : args[5]->Uint32Value(); + std::vector circles; + + cv::Mat gray; + + + equalizeHist(self->mat, gray); + + cv::HoughCircles(gray, circles, CV_HOUGH_GRADIENT, dp, minDist, higherThreshold, accumulatorThreshold, minRadius, maxRadius); + + v8::Local arr = NanNew(circles.size()); + + + for (unsigned int i=0; i < circles.size(); i++){ + v8::Local pt = NanNew(3); + pt->Set(0, NanNew((double) circles[i][0]));// center x + pt->Set(1, NanNew((double) circles[i][1]));// center y + pt->Set(2, NanNew((double) circles[i][2]));// radius + arr->Set(i, pt); + } + + NanReturnValue(arr); + +} + cv::Scalar setColor(Local objColor) { Local valB = objColor->Get(0); diff --git a/src/Matrix.h b/src/Matrix.h index 535134f..f041bca 100755 --- a/src/Matrix.h +++ b/src/Matrix.h @@ -74,6 +74,7 @@ class Matrix: public node::ObjectWrap { // Feature Detection JSFUNC(GoodFeaturesToTrack) JSFUNC(HoughLinesP) + JSFUNC(HoughCircles) JSFUNC(Crop)