Skip to content
This repository was archived by the owner on Oct 18, 2023. It is now read-only.

Commit 853de15

Browse files
added copyMakeBorder
1 parent 1cc4ac8 commit 853de15

File tree

5 files changed

+140
-0
lines changed

5 files changed

+140
-0
lines changed

cc/core/Mat.cc

+18
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ NAN_MODULE_INIT(Mat::Init) {
8787
Nan::SetPrototypeMethod(ctor, "goodFeaturesToTrackAsync", GoodFeaturesToTrackAsync);
8888
Nan::SetPrototypeMethod(ctor, "meanStdDev", MeanStdDev);
8989
Nan::SetPrototypeMethod(ctor, "meanStdDevAsync", MeanStdDevAsync);
90+
Nan::SetPrototypeMethod(ctor, "copyMakeBorder", CopyMakeBorder);
91+
Nan::SetPrototypeMethod(ctor, "copyMakeBorderAsync", CopyMakeBorderAsync);
9092
#if CV_VERSION_MINOR > 1
9193
Nan::SetPrototypeMethod(ctor, "rotate", Rotate);
9294
Nan::SetPrototypeMethod(ctor, "rotateAsync", RotateAsync);
@@ -787,6 +789,22 @@ NAN_METHOD(Mat::MeanStdDevAsync) {
787789
);
788790
}
789791

792+
NAN_METHOD(Mat::CopyMakeBorder) {
793+
FF::SyncBinding(
794+
std::make_shared<MatBindings::CopyMakeBorderWorker>(Mat::Converter::unwrap(info.This())),
795+
"Mat::CopyMakeBorder",
796+
info
797+
);
798+
}
799+
800+
NAN_METHOD(Mat::CopyMakeBorderAsync) {
801+
FF::AsyncBinding(
802+
std::make_shared<MatBindings::CopyMakeBorderWorker>(Mat::Converter::unwrap(info.This())),
803+
"Mat::CopyMakeBorderAsync",
804+
info
805+
);
806+
}
807+
790808
#if CV_VERSION_MINOR > 1
791809
NAN_METHOD(Mat::Rotate) {
792810
FF::SyncBinding(

cc/core/Mat.h

+2
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ class Mat : public Nan::ObjectWrap {
118118
static NAN_METHOD(GoodFeaturesToTrackAsync);
119119
static NAN_METHOD(MeanStdDev);
120120
static NAN_METHOD(MeanStdDevAsync);
121+
static NAN_METHOD(CopyMakeBorder);
122+
static NAN_METHOD(CopyMakeBorderAsync);
121123
#if CV_VERSION_MINOR > 1
122124
static NAN_METHOD(Rotate);
123125
static NAN_METHOD(RotateAsync);

cc/core/MatBindings.h

+70
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,76 @@ namespace MatBindings {
732732
}
733733
};
734734

735+
struct CopyMakeBorderWorker : public CatchCvExceptionWorker {
736+
public:
737+
cv::Mat self;
738+
CopyMakeBorderWorker(cv::Mat self) {
739+
this->self = self;
740+
}
741+
742+
cv::Mat result;
743+
int top, bottom, left, right;
744+
int borderType = cv::BORDER_CONSTANT;
745+
double v1 = 0;
746+
cv::Vec2d v2 = 0;
747+
cv::Vec3d v3 = 0;
748+
cv::Vec4d v4 = 0;
749+
750+
std::string executeCatchCvExceptionWorker() {
751+
if (self.channels() == 1)
752+
cv::copyMakeBorder(self, result, top, bottom, left, right, borderType, v1);
753+
else if (self.channels() == 2)
754+
cv::copyMakeBorder(self, result, top, bottom, left, right, borderType, v2);
755+
else if (self.channels() == 3)
756+
cv::copyMakeBorder(self, result, top, bottom, left, right, borderType, v3);
757+
else if (self.channels() == 4)
758+
cv::copyMakeBorder(self, result, top, bottom, left, right, borderType, v4);
759+
return "";
760+
}
761+
762+
v8::Local<v8::Value> getReturnValue() {
763+
return Mat::Converter::wrap(result);
764+
}
765+
766+
bool unwrapRequiredArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
767+
return (
768+
IntConverter::arg(0, &top, info) ||
769+
IntConverter::arg(1, &bottom, info) ||
770+
IntConverter::arg(2, &left, info) ||
771+
IntConverter::arg(3, &right, info)
772+
);
773+
}
774+
775+
bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
776+
return (
777+
IntConverter::optArg(4, &borderType, info) ||
778+
(
779+
self.channels() == 1 && DoubleConverter::optArg(5, &v1, info) ||
780+
self.channels() == 2 && Vec2::Converter::optArg(5, &v2, info) ||
781+
self.channels() == 3 && Vec3::Converter::optArg(5, &v3, info) ||
782+
self.channels() == 4 && Vec4::Converter::optArg(5, &v4, info)
783+
)
784+
);
785+
}
786+
787+
bool hasOptArgsObject(Nan::NAN_METHOD_ARGS_TYPE info) {
788+
return FF_ARG_IS_OBJECT(4);
789+
}
790+
791+
bool unwrapOptionalArgsFromOpts(Nan::NAN_METHOD_ARGS_TYPE info) {
792+
v8::Local<v8::Object> opts = info[4]->ToObject();
793+
return (
794+
IntConverter::optProp(&borderType, "borderType", opts) ||
795+
(
796+
self.channels() == 1 && DoubleConverter::optProp(&v1, "value", opts) ||
797+
self.channels() == 2 && Vec2::Converter::optProp(&v2, "value", opts) ||
798+
self.channels() == 3 && Vec3::Converter::optProp(&v3, "value", opts) ||
799+
self.channels() == 4 && Vec4::Converter::optProp(&v4, "value", opts)
800+
)
801+
);
802+
}
803+
};
804+
735805
#if CV_VERSION_MINOR > 1
736806
struct RotateWorker : public OpWithCodeWorker {
737807
public:

lib/typings/Mat.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ export class Mat {
7979
convertToAsync(type: number, alpha?: number, beta?: number): Promise<Mat>;
8080
copy(mask?: Mat): Mat;
8181
copyAsync(mask?: Mat): Promise<Mat>;
82+
copyMakeBorder(top: number, bottom: number, left: number, right: number, borderType?: number, value?: number | Vec2 | Vec3 | Vec4): Mat;
83+
copyMakeBorderAsync(top: number, bottom: number, left: number, right: number, borderType?: number, value?: number | Vec2 | Vec3 | Vec4): Promise<Mat>;
8284
copyTo(dst: Mat, mask?: Mat): Mat;
8385
copyToAsync(dst: Mat, mask?: Mat): Promise<Mat>;
8486
cornerEigenValsAndVecs(blockSize: number, ksize?: number, borderType?: number): Mat;

test/tests/core/Mat/Mat.test.js

+48
Original file line numberDiff line numberDiff line change
@@ -827,5 +827,53 @@ describe('Mat', () => {
827827
}
828828
});
829829
});
830+
831+
describe('copyMakeBorder', () => {
832+
const top = 1;
833+
const bottom = 1;
834+
const left = 1;
835+
const right = 1;
836+
837+
const getRequiredArgs = () => ([
838+
top,
839+
bottom,
840+
left,
841+
right
842+
]);
843+
844+
const borderType = cv.BORDER_CONSTANT;
845+
846+
const makeExpectOutput = (type, value) => (res, _, args) => {
847+
expect(res).to.be.instanceOf(cv.Mat);
848+
assertMetaData(res)(22, 22, type);
849+
if (args[5] === 255 || (args[4] && args[4].value)) {
850+
const upperLeft = res.at(0, 0);
851+
if (typeof upperLeft === 'object') {
852+
['x', 'y', 'z', 'w'].forEach(k => expect(upperLeft[k]).to.eq(value[k]));
853+
} else {
854+
expect(upperLeft).to.equal(value);
855+
}
856+
}
857+
};
858+
859+
const makeTest = (type, defaultValue, value) => () => {
860+
generateAPITests({
861+
getDut: () => new cv.Mat(20, 20, type, defaultValue),
862+
methodName: 'copyMakeBorder',
863+
methodNameSpace: 'Mat',
864+
getRequiredArgs,
865+
getOptionalArgsMap: () => ([
866+
['borderType', borderType],
867+
['value', value]
868+
]),
869+
expectOutput: makeExpectOutput(type, value)
870+
});
871+
};
872+
873+
describe('C1', makeTest(cv.CV_8U, 0, 255));
874+
describe('C2', makeTest(cv.CV_8UC2, [0, 0], new cv.Vec(255, 200)));
875+
describe('C3', makeTest(cv.CV_8UC3, [0, 0, 0], new cv.Vec(255, 200, 100)));
876+
describe('C4', makeTest(cv.CV_8UC4, [0, 0, 0, 0], new cv.Vec(255, 200, 100, 50)));
877+
});
830878
});
831879

0 commit comments

Comments
 (0)