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

Commit 2cdcbff

Browse files
committed
full get & set for 3D mats
1 parent a750355 commit 2cdcbff

File tree

2 files changed

+96
-6
lines changed

2 files changed

+96
-6
lines changed

cc/core/Mat.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,12 @@ NAN_METHOD(Mat::Set) {
291291

292292
NAN_METHOD(Mat::GetDataAsArray) {
293293
cv::Mat mat = FF_UNWRAP_MAT_AND_GET(info.This());
294-
FF_ARR rowArray = FF_NEW_ARRAY(mat.rows);
295-
FF_MAT_APPLY_TYPED_OPERATOR(mat, rowArray, mat.type(), FF_JS_ARRAY_FROM_MAT, FF::matGet);
294+
FF_ARR rowArray = FF_NEW_ARRAY(mat.size[0]);
295+
if (mat.dims > 2) { // 3D
296+
FF_MAT_APPLY_TYPED_OPERATOR(mat, rowArray, mat.type(), FF_JS_ARRAY_FROM_MAT_3D, FF::matGet);
297+
} else { // 2D
298+
FF_MAT_APPLY_TYPED_OPERATOR(mat, rowArray, mat.type(), FF_JS_ARRAY_FROM_MAT, FF::matGet);
299+
}
296300
FF_RETURN(rowArray);
297301
}
298302

cc/core/matUtils.h

Lines changed: 90 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@
44
#ifndef __FF_MATUTILS_H__
55
#define __FF_MATUTILS_H__
66

7-
#define FF_MAT_AT(mat, val, get) \
8-
val = get(mat, info[0]->Int32Value(), info[1]->Int32Value());
7+
#define FF_MAT_AT(mat, val, get) \
8+
if (mat.dims > 2) \
9+
val = get(mat, info[0]->Int32Value(), info[1]->Int32Value(), info[2]->Int32Value()); \
10+
else \
11+
val = get(mat, info[0]->Int32Value(), info[1]->Int32Value());
912

10-
#define FF_MAT_SET(mat, val, put) \
11-
put(mat, val, info[0]->Int32Value(), info[1]->Int32Value());
13+
#define FF_MAT_SET(mat, val, put) \
14+
if (mat.dims > 2) \
15+
put(mat, val, info[0]->Int32Value(), info[1]->Int32Value(), info[2]->Int32Value()); \
16+
else \
17+
put(mat, val, info[0]->Int32Value(), info[1]->Int32Value());
1218

1319
#define FF_MAT_FILL(mat, vec, put) \
1420
for (int r = 0; r < mat.rows; r++) { \
@@ -34,6 +40,19 @@
3440
rowArray->Set(r, colArray); \
3541
}
3642

43+
#define FF_JS_ARRAY_FROM_MAT_3D(mat, rowArray, get) \
44+
for (int r = 0; r < mat.size[0]; r++) { \
45+
v8::Local<v8::Array> colArray = Nan::New<v8::Array>(mat.size[1]); \
46+
for (int c = 0; c < mat.size[1]; c++) { \
47+
v8::Local<v8::Array> depthArray = Nan::New<v8::Array>(mat.size[2]); \
48+
for (int z = 0; z < mat.size[2]; z++) { \
49+
depthArray->Set(z, get(mat, r, c, z)); \
50+
} \
51+
colArray->Set(c, depthArray); \
52+
} \
53+
rowArray->Set(r, colArray); \
54+
}
55+
3756
#define FF_MAT_APPLY_TYPED_OPERATOR(mat, arg, type, ITERATOR, OPERATOR) { \
3857
switch (type) { \
3958
case CV_8UC1: \
@@ -138,6 +157,11 @@ namespace FF {
138157
mat.at<type>(r, c) = (type)value->NumberValue();
139158
}
140159

160+
template<typename type>
161+
static inline void matPutVal(cv::Mat mat, v8::Local<v8::Value> value, int r, int c, int z) {
162+
mat.at<type>(r, c, z) = (type)value->NumberValue();
163+
}
164+
141165
template<typename type>
142166
static inline void matPutVec2(cv::Mat mat, v8::Local<v8::Value> vector, int r, int c) {
143167
v8::Local<v8::Array> vec = v8::Local<v8::Array>::Cast(vector);
@@ -147,6 +171,15 @@ namespace FF {
147171
);
148172
}
149173

174+
template<typename type>
175+
static inline void matPutVec2(cv::Mat mat, v8::Local<v8::Value> vector, int r, int c, int z) {
176+
v8::Local<v8::Array> vec = v8::Local<v8::Array>::Cast(vector);
177+
mat.at< cv::Vec<type, 2> >(r, c, z) = cv::Vec<type, 2>(
178+
(type)vec->Get(0)->NumberValue(),
179+
(type)vec->Get(1)->NumberValue()
180+
);
181+
}
182+
150183
template<typename type>
151184
static inline void matPutVec3(cv::Mat mat, v8::Local<v8::Value> vector, int r, int c) {
152185
v8::Local<v8::Array> vec = v8::Local<v8::Array>::Cast(vector);
@@ -157,6 +190,16 @@ namespace FF {
157190
);
158191
}
159192

193+
template<typename type>
194+
static inline void matPutVec3(cv::Mat mat, v8::Local<v8::Value> vector, int r, int c, int z) {
195+
v8::Local<v8::Array> vec = v8::Local<v8::Array>::Cast(vector);
196+
mat.at< cv::Vec<type, 3> >(r, c, z) = cv::Vec<type, 3>(
197+
(type)vec->Get(0)->NumberValue(),
198+
(type)vec->Get(1)->NumberValue(),
199+
(type)vec->Get(2)->NumberValue()
200+
);
201+
}
202+
160203
template<typename type>
161204
static inline void matPutVec4(cv::Mat mat, v8::Local<v8::Value> vector, int r, int c) {
162205
v8::Local<v8::Array> vec = v8::Local<v8::Array>::Cast(vector);
@@ -168,11 +211,27 @@ namespace FF {
168211
);
169212
}
170213

214+
template<typename type>
215+
static inline void matPutVec4(cv::Mat mat, v8::Local<v8::Value> vector, int r, int c, int z) {
216+
v8::Local<v8::Array> vec = v8::Local<v8::Array>::Cast(vector);
217+
mat.at< cv::Vec<type, 4> >(r, c, z) = cv::Vec<type, 4>(
218+
(type)vec->Get(0)->NumberValue(),
219+
(type)vec->Get(1)->NumberValue(),
220+
(type)vec->Get(2)->NumberValue(),
221+
(type)vec->Get(3)->NumberValue()
222+
);
223+
}
224+
171225
template<typename type>
172226
static inline v8::Local<v8::Value> matGetVal(cv::Mat mat, int r, int c) {
173227
return Nan::New(mat.at<type>(r, c));
174228
}
175229

230+
template<typename type>
231+
static inline v8::Local<v8::Value> matGetVal(cv::Mat mat, int r, int c, int z) {
232+
return Nan::New(mat.at<type>(r, c, z));
233+
}
234+
176235
template<typename type>
177236
static inline v8::Local<v8::Value> matGetVec2(cv::Mat mat, int r, int c) {
178237
v8::Local<v8::Array> vec = Nan::New<v8::Array>(2);
@@ -181,6 +240,14 @@ namespace FF {
181240
return vec;
182241
}
183242

243+
template<typename type>
244+
static inline v8::Local<v8::Value> matGetVec2(cv::Mat mat, int r, int c, int z) {
245+
v8::Local<v8::Array> vec = Nan::New<v8::Array>(2);
246+
vec->Set(0, Nan::New(mat.at< cv::Vec<type, 2> >(r, c, z)[0]));
247+
vec->Set(1, Nan::New(mat.at< cv::Vec<type, 2> >(r, c, z)[1]));
248+
return vec;
249+
}
250+
184251
template<typename type>
185252
static inline v8::Local<v8::Value> matGetVec3(cv::Mat mat, int r, int c) {
186253
v8::Local<v8::Array> vec = Nan::New<v8::Array>(3);
@@ -190,6 +257,15 @@ namespace FF {
190257
return vec;
191258
}
192259

260+
template<typename type>
261+
static inline v8::Local<v8::Value> matGetVec3(cv::Mat mat, int r, int c, int z) {
262+
v8::Local<v8::Array> vec = Nan::New<v8::Array>(3);
263+
vec->Set(0, Nan::New(mat.at< cv::Vec<type, 3> >(r, c, z)[0]));
264+
vec->Set(1, Nan::New(mat.at< cv::Vec<type, 3> >(r, c, z)[1]));
265+
vec->Set(2, Nan::New(mat.at< cv::Vec<type, 3> >(r, c, z)[2]));
266+
return vec;
267+
}
268+
193269
template<typename type>
194270
static inline v8::Local<v8::Value> matGetVec4(cv::Mat mat, int r, int c) {
195271
v8::Local<v8::Array> vec = Nan::New<v8::Array>(4);
@@ -199,6 +275,16 @@ namespace FF {
199275
vec->Set(3, Nan::New(mat.at< cv::Vec<type, 4> >(r, c)[3]));
200276
return vec;
201277
}
278+
279+
template<typename type>
280+
static inline v8::Local<v8::Value> matGetVec4(cv::Mat mat, int r, int c, int z) {
281+
v8::Local<v8::Array> vec = Nan::New<v8::Array>(4);
282+
vec->Set(0, Nan::New(mat.at< cv::Vec<type, 4> >(r, c, z)[0]));
283+
vec->Set(1, Nan::New(mat.at< cv::Vec<type, 4> >(r, c, z)[1]));
284+
vec->Set(2, Nan::New(mat.at< cv::Vec<type, 4> >(r, c, z)[2]));
285+
vec->Set(3, Nan::New(mat.at< cv::Vec<type, 4> >(r, c, z)[3]));
286+
return vec;
287+
}
202288
}
203289

204290
#endif

0 commit comments

Comments
 (0)