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

Commit f369467

Browse files
Merge pull request justadudewhohacks#273 from justadudewhohacks/justadudewhohacks#251
added copyMakeBorder
2 parents ff3c65c + 853de15 commit f369467

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
@@ -89,6 +89,8 @@ NAN_MODULE_INIT(Mat::Init) {
8989
Nan::SetPrototypeMethod(ctor, "meanAsync", MeanAsync);
9090
Nan::SetPrototypeMethod(ctor, "meanStdDev", MeanStdDev);
9191
Nan::SetPrototypeMethod(ctor, "meanStdDevAsync", MeanStdDevAsync);
92+
Nan::SetPrototypeMethod(ctor, "copyMakeBorder", CopyMakeBorder);
93+
Nan::SetPrototypeMethod(ctor, "copyMakeBorderAsync", CopyMakeBorderAsync);
9294
#if CV_VERSION_MINOR > 1
9395
Nan::SetPrototypeMethod(ctor, "rotate", Rotate);
9496
Nan::SetPrototypeMethod(ctor, "rotateAsync", RotateAsync);
@@ -805,6 +807,22 @@ NAN_METHOD(Mat::MeanStdDevAsync) {
805807
);
806808
}
807809

810+
NAN_METHOD(Mat::CopyMakeBorder) {
811+
FF::SyncBinding(
812+
std::make_shared<MatBindings::CopyMakeBorderWorker>(Mat::Converter::unwrap(info.This())),
813+
"Mat::CopyMakeBorder",
814+
info
815+
);
816+
}
817+
818+
NAN_METHOD(Mat::CopyMakeBorderAsync) {
819+
FF::AsyncBinding(
820+
std::make_shared<MatBindings::CopyMakeBorderWorker>(Mat::Converter::unwrap(info.This())),
821+
"Mat::CopyMakeBorderAsync",
822+
info
823+
);
824+
}
825+
808826
#if CV_VERSION_MINOR > 1
809827
NAN_METHOD(Mat::Rotate) {
810828
FF::SyncBinding(

cc/core/Mat.h

+2
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ class Mat : public Nan::ObjectWrap {
120120
static NAN_METHOD(MeanAsync);
121121
static NAN_METHOD(MeanStdDev);
122122
static NAN_METHOD(MeanStdDevAsync);
123+
static NAN_METHOD(CopyMakeBorder);
124+
static NAN_METHOD(CopyMakeBorderAsync);
123125
#if CV_VERSION_MINOR > 1
124126
static NAN_METHOD(Rotate);
125127
static NAN_METHOD(RotateAsync);

cc/core/MatBindings.h

+70
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,76 @@ namespace MatBindings {
759759
}
760760
};
761761

762+
struct CopyMakeBorderWorker : public CatchCvExceptionWorker {
763+
public:
764+
cv::Mat self;
765+
CopyMakeBorderWorker(cv::Mat self) {
766+
this->self = self;
767+
}
768+
769+
cv::Mat result;
770+
int top, bottom, left, right;
771+
int borderType = cv::BORDER_CONSTANT;
772+
double v1 = 0;
773+
cv::Vec2d v2 = 0;
774+
cv::Vec3d v3 = 0;
775+
cv::Vec4d v4 = 0;
776+
777+
std::string executeCatchCvExceptionWorker() {
778+
if (self.channels() == 1)
779+
cv::copyMakeBorder(self, result, top, bottom, left, right, borderType, v1);
780+
else if (self.channels() == 2)
781+
cv::copyMakeBorder(self, result, top, bottom, left, right, borderType, v2);
782+
else if (self.channels() == 3)
783+
cv::copyMakeBorder(self, result, top, bottom, left, right, borderType, v3);
784+
else if (self.channels() == 4)
785+
cv::copyMakeBorder(self, result, top, bottom, left, right, borderType, v4);
786+
return "";
787+
}
788+
789+
v8::Local<v8::Value> getReturnValue() {
790+
return Mat::Converter::wrap(result);
791+
}
792+
793+
bool unwrapRequiredArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
794+
return (
795+
IntConverter::arg(0, &top, info) ||
796+
IntConverter::arg(1, &bottom, info) ||
797+
IntConverter::arg(2, &left, info) ||
798+
IntConverter::arg(3, &right, info)
799+
);
800+
}
801+
802+
bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
803+
return (
804+
IntConverter::optArg(4, &borderType, info) ||
805+
(
806+
self.channels() == 1 && DoubleConverter::optArg(5, &v1, info) ||
807+
self.channels() == 2 && Vec2::Converter::optArg(5, &v2, info) ||
808+
self.channels() == 3 && Vec3::Converter::optArg(5, &v3, info) ||
809+
self.channels() == 4 && Vec4::Converter::optArg(5, &v4, info)
810+
)
811+
);
812+
}
813+
814+
bool hasOptArgsObject(Nan::NAN_METHOD_ARGS_TYPE info) {
815+
return FF_ARG_IS_OBJECT(4);
816+
}
817+
818+
bool unwrapOptionalArgsFromOpts(Nan::NAN_METHOD_ARGS_TYPE info) {
819+
v8::Local<v8::Object> opts = info[4]->ToObject();
820+
return (
821+
IntConverter::optProp(&borderType, "borderType", opts) ||
822+
(
823+
self.channels() == 1 && DoubleConverter::optProp(&v1, "value", opts) ||
824+
self.channels() == 2 && Vec2::Converter::optProp(&v2, "value", opts) ||
825+
self.channels() == 3 && Vec3::Converter::optProp(&v3, "value", opts) ||
826+
self.channels() == 4 && Vec4::Converter::optProp(&v4, "value", opts)
827+
)
828+
);
829+
}
830+
};
831+
762832
#if CV_VERSION_MINOR > 1
763833
struct RotateWorker : public OpWithCodeWorker {
764834
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
@@ -908,5 +908,53 @@ describe('Mat', () => {
908908
}
909909
});
910910
});
911+
912+
describe('copyMakeBorder', () => {
913+
const top = 1;
914+
const bottom = 1;
915+
const left = 1;
916+
const right = 1;
917+
918+
const getRequiredArgs = () => ([
919+
top,
920+
bottom,
921+
left,
922+
right
923+
]);
924+
925+
const borderType = cv.BORDER_CONSTANT;
926+
927+
const makeExpectOutput = (type, value) => (res, _, args) => {
928+
expect(res).to.be.instanceOf(cv.Mat);
929+
assertMetaData(res)(22, 22, type);
930+
if (args[5] === 255 || (args[4] && args[4].value)) {
931+
const upperLeft = res.at(0, 0);
932+
if (typeof upperLeft === 'object') {
933+
['x', 'y', 'z', 'w'].forEach(k => expect(upperLeft[k]).to.eq(value[k]));
934+
} else {
935+
expect(upperLeft).to.equal(value);
936+
}
937+
}
938+
};
939+
940+
const makeTest = (type, defaultValue, value) => () => {
941+
generateAPITests({
942+
getDut: () => new cv.Mat(20, 20, type, defaultValue),
943+
methodName: 'copyMakeBorder',
944+
methodNameSpace: 'Mat',
945+
getRequiredArgs,
946+
getOptionalArgsMap: () => ([
947+
['borderType', borderType],
948+
['value', value]
949+
]),
950+
expectOutput: makeExpectOutput(type, value)
951+
});
952+
};
953+
954+
describe('C1', makeTest(cv.CV_8U, 0, 255));
955+
describe('C2', makeTest(cv.CV_8UC2, [0, 0], new cv.Vec(255, 200)));
956+
describe('C3', makeTest(cv.CV_8UC3, [0, 0, 0], new cv.Vec(255, 200, 100)));
957+
describe('C4', makeTest(cv.CV_8UC4, [0, 0, 0, 0], new cv.Vec(255, 200, 100, 50)));
958+
});
911959
});
912960

0 commit comments

Comments
 (0)