Skip to content

Commit 78b4641

Browse files
Merge pull request #245 from justadudewhohacks/some-features
integral + meanStdDev
2 parents 2353575 + 95eb8ef commit 78b4641

File tree

7 files changed

+153
-2
lines changed

7 files changed

+153
-2
lines changed

cc/core/Mat.cc

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ NAN_MODULE_INIT(Mat::Init) {
8585
Nan::SetPrototypeMethod(ctor, "sumAsync", SumAsync);
8686
Nan::SetPrototypeMethod(ctor, "goodFeaturesToTrack", GoodFeaturesToTrack);
8787
Nan::SetPrototypeMethod(ctor, "goodFeaturesToTrackAsync", GoodFeaturesToTrackAsync);
88+
Nan::SetPrototypeMethod(ctor, "meanStdDev", MeanStdDev);
89+
Nan::SetPrototypeMethod(ctor, "meanStdDevAsync", MeanStdDevAsync);
8890
#if CV_VERSION_MINOR > 1
8991
Nan::SetPrototypeMethod(ctor, "rotate", Rotate);
9092
Nan::SetPrototypeMethod(ctor, "rotateAsync", RotateAsync);
@@ -1269,6 +1271,7 @@ struct Mat::GoodFeaturesToTrackWorker : public SimpleWorker {
12691271
);
12701272
}
12711273

1274+
12721275
const char* execute() {
12731276
#if CV_VERSION_MINOR >= 4
12741277
cv::goodFeaturesToTrack(
@@ -1302,6 +1305,48 @@ NAN_METHOD(Mat::GoodFeaturesToTrackAsync) {
13021305
FF_WORKER_ASYNC("Mat::GoodFeaturesToTrackAsync", GoodFeaturesToTrackWorker, worker);
13031306
}
13041307

1308+
struct Mat::MeanStdDevWorker : public SimpleWorker {
1309+
public:
1310+
cv::Mat self;
1311+
MeanStdDevWorker(cv::Mat self) {
1312+
this->self = self;
1313+
}
1314+
1315+
cv::Mat mask = cv::noArray().getMat();
1316+
1317+
cv::Mat mean;
1318+
cv::Mat stddev;
1319+
1320+
const char* execute() {
1321+
cv::meanStdDev(self, mean, stddev, mask);
1322+
return "";
1323+
}
1324+
1325+
v8::Local<v8::Value> getReturnValue() {
1326+
v8::Local<v8::Object> ret = Nan::New<v8::Object>();
1327+
Nan::Set(ret, Nan::New("mean").ToLocalChecked(), Mat::Converter::wrap(mean));
1328+
Nan::Set(ret, Nan::New("stddev").ToLocalChecked(), Mat::Converter::wrap(stddev));
1329+
return ret;
1330+
}
1331+
1332+
bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
1333+
return (
1334+
Mat::Converter::optArg(0, &mask, info)
1335+
);
1336+
}
1337+
};
1338+
1339+
NAN_METHOD(Mat::MeanStdDev) {
1340+
MeanStdDevWorker worker(Mat::Converter::unwrap(info.This()));
1341+
FF_WORKER_SYNC("Mat::MeanStdDev", worker);
1342+
info.GetReturnValue().Set(worker.getReturnValue());
1343+
}
1344+
1345+
NAN_METHOD(Mat::MeanStdDevAsync) {
1346+
MeanStdDevWorker worker(Mat::Converter::unwrap(info.This()));
1347+
FF_WORKER_ASYNC("Mat::MeanStdDevAsync", MeanStdDevWorker, worker);
1348+
}
1349+
13051350
#if CV_VERSION_MINOR > 1
13061351
struct Mat::RotateWorker : public OpWithCodeWorker {
13071352
public:
@@ -1374,3 +1419,4 @@ NAN_METHOD(Mat::Release) {
13741419
mat->release();
13751420
}
13761421

1422+

cc/core/Mat.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ class Mat : public Nan::ObjectWrap {
147147
static NAN_METHOD(Flip);
148148
static NAN_METHOD(FlipAsync);
149149

150+
struct MeanStdDevWorker;
151+
static NAN_METHOD(MeanStdDev);
152+
static NAN_METHOD(MeanStdDevAsync);
153+
150154
#if CV_VERSION_MINOR > 1
151155
struct RotateWorker;
152156
static NAN_METHOD(Rotate);
@@ -155,6 +159,7 @@ class Mat : public Nan::ObjectWrap {
155159

156160
static NAN_METHOD(Release);
157161

162+
158163
static Nan::Persistent<v8::FunctionTemplate> constructor;
159164

160165
void setNativeProps(cv::Mat);

cc/core/MatImgproc.cc

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ void MatImgproc::Init(v8::Local<v8::FunctionTemplate> ctor) {
108108
Nan::SetPrototypeMethod(ctor, "cornerMinEigenValAsync", CornerMinEigenValAsync);
109109
Nan::SetPrototypeMethod(ctor, "cornerEigenValsAndVecs", CornerEigenValsAndVecs);
110110
Nan::SetPrototypeMethod(ctor, "cornerEigenValsAndVecsAsync", CornerEigenValsAndVecsAsync);
111+
Nan::SetPrototypeMethod(ctor, "integral", Integral);
112+
Nan::SetPrototypeMethod(ctor, "integralAsync", IntegralAsync);
111113
};
112114

113115
struct MatImgproc::BaseResizeWorker : public SimpleWorker {
@@ -2833,4 +2835,62 @@ NAN_METHOD(MatImgproc::CornerEigenValsAndVecs) {
28332835
NAN_METHOD(MatImgproc::CornerEigenValsAndVecsAsync) {
28342836
CornerEigenValsAndVecsWorker worker(Mat::Converter::unwrap(info.This()));
28352837
FF_WORKER_ASYNC("Mat::CornerEigenValsAndVecsAsync", CornerEigenValsAndVecsWorker, worker);
2838+
}
2839+
2840+
struct MatImgproc::IntegralWorker : public SimpleWorker {
2841+
public:
2842+
cv::Mat self;
2843+
IntegralWorker(cv::Mat self) {
2844+
this->self = self;
2845+
}
2846+
2847+
int sdepth = -1;
2848+
int sqdepth = -1;
2849+
2850+
cv::Mat sum;
2851+
cv::Mat sqsum;
2852+
cv::Mat tilted;
2853+
2854+
const char* execute() {
2855+
cv::integral(self, sum, sqsum, tilted, sdepth, sqdepth);
2856+
return "";
2857+
}
2858+
2859+
v8::Local<v8::Value> getReturnValue() {
2860+
v8::Local<v8::Object> ret = Nan::New<v8::Object>();
2861+
Nan::Set(ret, Nan::New("sum").ToLocalChecked(), Mat::Converter::wrap(sum));
2862+
Nan::Set(ret, Nan::New("sqsum").ToLocalChecked(), Mat::Converter::wrap(sqsum));
2863+
Nan::Set(ret, Nan::New("tilted").ToLocalChecked(), Mat::Converter::wrap(tilted));
2864+
return ret;
2865+
}
2866+
2867+
bool unwrapOptionalArgs(Nan::NAN_METHOD_ARGS_TYPE info) {
2868+
return (
2869+
IntConverter::optArg(0, &sdepth, info) ||
2870+
IntConverter::optArg(1, &sqdepth, info)
2871+
);
2872+
}
2873+
2874+
bool hasOptArgsObject(Nan::NAN_METHOD_ARGS_TYPE info) {
2875+
return FF_ARG_IS_OBJECT(0);
2876+
}
2877+
2878+
bool unwrapOptionalArgsFromOpts(Nan::NAN_METHOD_ARGS_TYPE info) {
2879+
v8::Local<v8::Object> opts = info[0]->ToObject();
2880+
return (
2881+
IntConverter::optProp(&sdepth, "sdepth", opts) ||
2882+
IntConverter::optProp(&sqdepth, "sqdepth", opts)
2883+
);
2884+
}
2885+
};
2886+
2887+
NAN_METHOD(MatImgproc::Integral) {
2888+
IntegralWorker worker(Mat::Converter::unwrap(info.This()));
2889+
FF_WORKER_SYNC("Mat::Integral", worker);
2890+
info.GetReturnValue().Set(worker.getReturnValue());
2891+
}
2892+
2893+
NAN_METHOD(MatImgproc::IntegralAsync) {
2894+
IntegralWorker worker(Mat::Converter::unwrap(info.This()));
2895+
FF_WORKER_ASYNC("Mat::IntegralAsync", IntegralWorker, worker);
28362896
}

cc/core/MatImgproc.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ class MatImgproc {
210210
struct CornerEigenValsAndVecsWorker;
211211
static NAN_METHOD(CornerEigenValsAndVecs);
212212
static NAN_METHOD(CornerEigenValsAndVecsAsync);
213+
214+
struct IntegralWorker;
215+
static NAN_METHOD(Integral);
216+
static NAN_METHOD(IntegralAsync);
213217
};
214218

215219
#endif

lib/typings/Mat.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,13 +183,17 @@ export class Mat {
183183
inRange(lower: Vec3, upper: Vec3): Mat;
184184
inRangeAsync(lower: number, upper: number): Promise<Mat>;
185185
inRangeAsync(lower: Vec3, upper: Vec3): Promise<Mat>;
186+
integral(sdepth?: number, sqdepth?: number): { sum: Mat, sqsum: Mat, tilted: Mat };
187+
integralAsync(sdepth?: number, sqdepth?: number): Promise<{ sum: Mat, sqsum: Mat, tilted: Mat }>;
186188
laplacian(ddepth: number, ksize?: number, scale?: number, delta?: number, borderType?: number): Mat;
187189
laplacianAsync(ddepth: number, ksize?: number, scale?: number, delta?: number, borderType?: number): Promise<Mat>;
188190
matMulDeriv(B: Mat): { dABdA: Mat, dABdB: Mat };
189191
matMulDerivAsync(B: Mat): Promise<{ dABdA: Mat, dABdB: Mat }>;
190192
matchTemplate(template: Mat, method: number, mask?: Mat): Mat;
191193
matchTemplateAsync(template: Mat, method: number, mask?: Mat): Promise<Mat>;
192194
mean(): Mat;
195+
meanStdDev(mask?: Mat): { mean: Mat, stddev: Mat };
196+
meanStdDevAsync(mask?: Mat): Promise<{ mean: Mat, stddev: Mat }>;
193197
medianBlur(kSize: number): Mat;
194198
medianBlurAsync(kSize: number): Promise<Mat>;
195199
minMaxLoc(mask?: Mat): { minVal: number, maxVal: number, minLoc: Point2, maxLoc: Point2 };

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,5 +811,21 @@ describe('Mat', () => {
811811
expectOutput
812812
});
813813
});
814+
815+
describe('meanStdDev', () => {
816+
const mask = new cv.Mat(20, 20, cv.CV_8U, 255);
817+
generateAPITests({
818+
getDut: () => new cv.Mat(20, 20, cv.CV_32F, 0.5),
819+
methodName: 'meanStdDev',
820+
methodNameSpace: 'Mat',
821+
getOptionalArgs: () => ([
822+
mask
823+
]),
824+
expectOutput: (res) => {
825+
expect(res).to.have.property('mean').to.be.instanceOf(cv.Mat);
826+
expect(res).to.have.property('stddev').to.be.instanceOf(cv.Mat);
827+
}
828+
});
829+
});
814830
});
815831

test/tests/core/Mat/imgprocTests.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1493,7 +1493,7 @@ module.exports = (getTestImg) => {
14931493
['blockSize', 3],
14941494
['gradientSize', 3],
14951495
['useHarrisDetector', false],
1496-
['harrisK', 0.04 ]
1496+
['harrisK', 0.04]
14971497
]),
14981498
expectOutput: (out) => {
14991499
expect(out).to.be.instanceOf(Array);
@@ -1511,7 +1511,7 @@ module.exports = (getTestImg) => {
15111511
20, 0.04, 1
15121512
]),
15131513
getOptionalArgsMap: () => ([
1514-
['mask', new cv.Mat(512,512,cv.CV_U8)],
1514+
['mask', new cv.Mat(512, 512, cv.CV_U8)],
15151515
['blockSize', 3],
15161516
['useHarrisDetector', false],
15171517
['harrisK', 0.04 ]
@@ -1525,5 +1525,21 @@ module.exports = (getTestImg) => {
15251525
});
15261526
});
15271527

1528+
describe('integral', () => {
1529+
generateAPITests({
1530+
getDut: () => new cv.Mat(20, 20, cv.CV_32F, 0.5),
1531+
methodName: 'integral',
1532+
methodNameSpace: 'Mat',
1533+
getOptionalArgsMap: () => ([
1534+
['sdepth', cv.CV_64F],
1535+
['sqdepth', cv.CV_64F]
1536+
]),
1537+
expectOutput: (res) => {
1538+
expect(res).to.have.property('sum').to.be.instanceOf(cv.Mat);
1539+
expect(res).to.have.property('sqsum').to.be.instanceOf(cv.Mat);
1540+
expect(res).to.have.property('tilted').to.be.instanceOf(cv.Mat);
1541+
}
1542+
});
1543+
});
15281544
});
15291545
};

0 commit comments

Comments
 (0)