diff --git a/examples/files/note.png b/examples/files/note.png new file mode 100644 index 0000000..1535bbb Binary files /dev/null and b/examples/files/note.png differ diff --git a/examples/remove-lines.js b/examples/remove-lines.js new file mode 100644 index 0000000..dc035da --- /dev/null +++ b/examples/remove-lines.js @@ -0,0 +1,30 @@ +var cv = require('../lib/opencv'); + +// Load the image +cv.readImage('./files/note.png', function(err, im) { + if (err) { + throw err; + } + if (im.width() < 1 || im.height() < 1) { + throw new Error('Image has no size'); + } + + im.cvtColor('CV_BGR2GRAY'); + var bw = im.adaptiveThreshold(255, 0, 0, 15, 2); + bw.bitwiseNot(bw); + + var vertical = bw.clone(); + + var verticalsize = vertical.size()[0] / 30; + var verticalStructure = cv.imgproc.getStructuringElement(1, [1, verticalsize]); + + // Apply morphology operations + vertical.erode(1, verticalStructure); + vertical.dilate(1, verticalStructure); + + vertical.bitwiseNot(vertical); + vertical.gaussianBlur([3, 3]); + + // Save output image + vertical.save('./tmp/note.png'); +}); diff --git a/src/ImgProc.cc b/src/ImgProc.cc index 719fd8b..8fa3ffb 100644 --- a/src/ImgProc.cc +++ b/src/ImgProc.cc @@ -9,6 +9,7 @@ void ImgProc::Init(Local target) { Nan::SetMethod(obj, "undistort", Undistort); Nan::SetMethod(obj, "initUndistortRectifyMap", InitUndistortRectifyMap); Nan::SetMethod(obj, "remap", Remap); + Nan::SetMethod(obj, "getStructuringElement", GetStructuringElement); target->Set(Nan::New("imgproc").ToLocalChecked(), obj); } @@ -157,3 +158,45 @@ NAN_METHOD(ImgProc::Remap) { return; } } + +// cv::getStructuringElement +NAN_METHOD(ImgProc::GetStructuringElement) { + Nan::EscapableHandleScope scope; + + try { + // Get the arguments + + if (info.Length() != 2) { + Nan::ThrowTypeError("Invalid number of arguments"); + } + + // Arg 0 is the element shape + if (!info[0]->IsNumber()) { + JSTHROW_TYPE("'shape' argument must be a number"); + } + int shape = info[0]->NumberValue(); + + // Arg 1 is the size of the structuring element + cv::Size ksize; + if (!info[1]->IsArray()) { + JSTHROW_TYPE("'ksize' argument must be a 2 double array"); + } + Local v8sz = info[1]->ToObject(); + ksize = cv::Size(v8sz->Get(0)->IntegerValue(), v8sz->Get(1)->IntegerValue()); + + // GetStructuringElement + cv::Mat mat = cv::getStructuringElement(shape, ksize); + + // Wrap the output image + Local outMatrixWrap = Nan::New(Matrix::constructor)->GetFunction()->NewInstance(); + Matrix *outMatrix = ObjectWrap::Unwrap(outMatrixWrap); + outMatrix->mat = mat; + + // Return the image + info.GetReturnValue().Set(outMatrixWrap); + } catch (cv::Exception &e) { + const char *err_msg = e.what(); + JSTHROW(err_msg); + return; + } +} diff --git a/src/ImgProc.h b/src/ImgProc.h index a1ef503..48f031f 100644 --- a/src/ImgProc.h +++ b/src/ImgProc.h @@ -12,6 +12,7 @@ public: static NAN_METHOD(Undistort); static NAN_METHOD(InitUndistortRectifyMap); static NAN_METHOD(Remap); + static NAN_METHOD(GetStructuringElement); }; #endif diff --git a/src/Matrix.cc b/src/Matrix.cc index e0026a7..7bdf195 100755 --- a/src/Matrix.cc +++ b/src/Matrix.cc @@ -1341,7 +1341,13 @@ NAN_METHOD(Matrix::Dilate) { Matrix *self = Nan::ObjectWrap::Unwrap(info.This()); int niters = info[0]->NumberValue(); - cv::dilate(self->mat, self->mat, cv::Mat(), cv::Point(-1, -1), niters); + cv::Mat kernel = cv::Mat(); + if (info.Length() == 2) { + Matrix *kernelMatrix = Nan::ObjectWrap::Unwrap(info[1]->ToObject()); + kernel = kernelMatrix->mat; + } + + cv::dilate(self->mat, self->mat, kernel, cv::Point(-1, -1), niters); info.GetReturnValue().Set(Nan::Null()); } @@ -1352,7 +1358,12 @@ NAN_METHOD(Matrix::Erode) { Matrix *self = Nan::ObjectWrap::Unwrap(info.This()); int niters = info[0]->NumberValue(); - cv::erode(self->mat, self->mat, cv::Mat(), cv::Point(-1, -1), niters); + cv::Mat kernel = cv::Mat(); + if (info.Length() == 2) { + Matrix *kernelMatrix = Nan::ObjectWrap::Unwrap(info[1]->ToObject()); + kernel = kernelMatrix->mat; + } + cv::erode(self->mat, self->mat, kernel, cv::Point(-1, -1), niters); info.GetReturnValue().Set(Nan::Null()); }