Skip to content

Commit 6a41cd0

Browse files
feat: core functions part 1
1 parent eba8718 commit 6a41cd0

File tree

6 files changed

+412
-23
lines changed

6 files changed

+412
-23
lines changed

cpp/FOCV_Function.cpp

Lines changed: 174 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,35 +34,46 @@ jsi::Object FOCV_Function::invoke(jsi::Runtime& runtime, const jsi::Value* argum
3434

3535
switch (hashString(functionName.c_str(), functionName.size())) {
3636
case hashString("cvtColor", 8): {
37-
cv::Mat src = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
38-
cv::Mat dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
39-
cv::cvtColor(src, dst, arguments[3].getNumber());
37+
cv::InputArray src = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
38+
cv::OutputArray dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
39+
auto code = arguments[3].getNumber();
40+
41+
if(arguments[4].isNumber()) {
42+
auto dsnCn = arguments[4].getNumber();
43+
44+
cv::cvtColor(src, dst, code, dsnCn);
45+
} else {
46+
cv::cvtColor(src, dst, code);
47+
}
48+
4049
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]), dst);
4150
} break;
4251
case hashString("inRange", 7): {
43-
cv::Mat src = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
44-
std::string s = FOCV_JsiObject::id_from_wrap(runtime, arguments[2]);
45-
std::string id = FOCV_JsiObject::type_from_wrap(runtime, arguments[2]);
46-
cv::Vec3b lowerBound = FOCV_Storage::get<cv::Vec3b>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
47-
cv::Vec3b upperBound = FOCV_Storage::get<cv::Vec3b>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
48-
cv::Mat dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[4]));
52+
auto src = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
53+
auto lowerBound = FOCV_Storage::get<cv::Vec3b>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
54+
auto upperBound = FOCV_Storage::get<cv::Vec3b>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
55+
auto dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[4]));
56+
4957
cv::inRange(src, lowerBound, upperBound, dst);
5058
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[4]), dst);
5159
} break;
5260
case hashString("split", 5): {
53-
cv::Mat src = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
54-
std::vector<cv::Mat> dst = FOCV_Storage::get<std::vector<cv::Mat>>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
61+
auto src = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
62+
auto dst = FOCV_Storage::get<std::vector<cv::Mat>>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
63+
5564
cv::split(src, dst);
5665
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]), dst);
5766
} break;
5867
case hashString("findContours", 12): {
59-
cv::Mat src = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
68+
auto src = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
69+
auto mode = arguments[2].getNumber();
70+
auto method = arguments[3].getNumber();
71+
6072
std::vector<std::vector<cv::Point>> contours;
6173

62-
cv::findContours(src, contours, arguments[2].getNumber(), arguments[3].getNumber());
74+
cv::findContours(src, contours, mode, method);
6375

6476
auto ids = FOCV_Ids();
65-
6677
for (size_t i = 0; i < contours.size(); i++) {
6778
auto id = FOCV_Storage::save(contours.at(i));
6879
ids.push(id);
@@ -71,18 +82,163 @@ jsi::Object FOCV_Function::invoke(jsi::Runtime& runtime, const jsi::Value* argum
7182
return ids.toJsiArray(runtime, "point_vector");
7283
} break;
7384
case hashString("contourArea", 11): {
74-
std::vector<cv::Point> src = FOCV_Storage::get<std::vector<cv::Point>>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
85+
auto src = FOCV_Storage::get<std::vector<cv::Point>>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
86+
auto oriented = arguments[2].getBool();
7587

76-
value.setProperty(runtime, "area", contourArea(src, arguments[2].getBool()));
88+
value.setProperty(runtime, "value", contourArea(src, oriented));
7789
} break;
7890
case hashString("boundingRect", 12): {
79-
std::vector<cv::Point> src = FOCV_Storage::get<std::vector<cv::Point>>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
80-
cv::Rect rect = cv::boundingRect(src);
91+
auto src = FOCV_Storage::get<std::vector<cv::Point>>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
8192

93+
cv::Rect rect = cv::boundingRect(src);
8294
std::string id = FOCV_Storage::save(rect);
8395

8496
return FOCV_JsiObject::wrap(runtime, "rect", id);
8597
} break;
98+
99+
case hashString("absdiff", 7): {
100+
auto src1 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
101+
auto src2 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
102+
auto dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
103+
104+
cv::absdiff(src1, src2, dst);
105+
106+
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]), dst);
107+
} break;
108+
case hashString("add", 3): {
109+
auto src1 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
110+
auto src2 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
111+
auto dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
112+
113+
if(arguments[5].isNumber()) {
114+
auto mask = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[4]));
115+
auto dtype = arguments[5].asNumber();
116+
117+
cv::add(src1, src2, dst, mask, dtype);
118+
} else if(arguments[4].isObject()) {
119+
auto mask = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[4]));
120+
121+
cv::add(src1, src2, dst, mask);
122+
} else {
123+
cv::add(src1, src2, dst);
124+
}
125+
126+
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]), dst);
127+
} break;
128+
case hashString("addWeighted", 11): {
129+
auto src1 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
130+
auto alpha = arguments[2].asNumber();
131+
auto src2 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
132+
auto beta = arguments[4].asNumber();
133+
auto gamma = arguments[5].asNumber();
134+
auto dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[6]));
135+
136+
if(arguments[7].isNumber()) {
137+
auto dtype = arguments[7].asNumber();
138+
139+
cv::addWeighted(src1, alpha, src2, beta, gamma, dst, dtype);
140+
} else {
141+
cv::addWeighted(src1, alpha, src2, beta, gamma, dst);
142+
}
143+
144+
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[6]), dst);
145+
} break;
146+
case hashString("batchDistance", 13): {
147+
auto src1 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
148+
auto src2 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
149+
auto dist = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
150+
auto dtype = arguments[4].asNumber();
151+
auto nidx = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[5]));
152+
auto normType = arguments[6].asNumber();
153+
auto K = arguments[7].asNumber();
154+
auto mask = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[8]));
155+
auto update = arguments[9].asNumber();
156+
auto crosscheck = arguments[10].asNumber();
157+
158+
cv::batchDistance(src1, src2, dist, dtype, nidx, normType, K, mask, update, crosscheck);
159+
160+
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]), dist);
161+
} break;
162+
case hashString("bitwise_and", 11): {
163+
auto src1 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
164+
auto src2 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
165+
auto dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
166+
167+
if(arguments[4].isObject()) {
168+
auto mask = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[4]));
169+
170+
cv::bitwise_and(src1, src2, dst, mask);
171+
} else {
172+
cv::bitwise_and(src1, src2, dst);
173+
}
174+
175+
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]), dst);
176+
} break;
177+
case hashString("bitwise_not", 11): {
178+
auto src1 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
179+
auto dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
180+
181+
if(arguments[3].isObject()) {
182+
auto mask = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
183+
184+
cv::bitwise_not(src1, dst, mask);
185+
} else {
186+
cv::bitwise_not(src1, dst);
187+
}
188+
189+
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]), dst);
190+
} break;
191+
case hashString("bitwise_or", 10): {
192+
auto src1 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
193+
auto src2 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
194+
auto dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
195+
196+
if(arguments[4].isObject()) {
197+
auto mask = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[4]));
198+
199+
cv::bitwise_or(src1, src2, dst, mask);
200+
} else {
201+
cv::bitwise_or(src1, src2, dst);
202+
}
203+
204+
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]), dst);
205+
} break;
206+
case hashString("bitwise_xor", 11): {
207+
auto src1 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
208+
auto src2 = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[2]));
209+
auto dst = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
210+
211+
if(arguments[4].isObject()) {
212+
auto mask = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[4]));
213+
214+
cv::bitwise_xor(src1, src2, dst, mask);
215+
} else {
216+
cv::bitwise_xor(src1, src2, dst);
217+
}
218+
219+
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]), dst);
220+
} break;
221+
case hashString("borderInterpolate", 17): {
222+
auto p = arguments[1].asNumber();
223+
auto len = arguments[2].asNumber();
224+
auto borderType = arguments[3].asNumber();
225+
226+
auto result = cv::borderInterpolate(p, len, borderType);
227+
228+
value.setProperty(runtime, "value", result);
229+
} break;
230+
case hashString("calcCovarMatrix", 15): {
231+
auto samples = FOCV_Storage::get<std::vector<cv::Mat>>(FOCV_JsiObject::id_from_wrap(runtime, arguments[1]));
232+
auto nsamples = arguments[2].asNumber();
233+
auto covar = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]));
234+
auto mean = FOCV_Storage::get<cv::Mat>(FOCV_JsiObject::id_from_wrap(runtime, arguments[4]));
235+
auto flags = arguments[5].asNumber();
236+
auto dtype = arguments[6].asNumber();
237+
238+
cv::calcCovarMatrix(samples.data(), nsamples, covar, mean, flags, dtype);
239+
240+
FOCV_Storage::save(FOCV_JsiObject::id_from_wrap(runtime, arguments[3]), covar);
241+
} break;
86242
}
87243

88244
return value;

cpp/FOCV_Storage.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <boost/uuid/uuid_generators.hpp>
1515
#include <boost/uuid/uuid_io.hpp>
1616

17+
1718
#ifdef __cplusplus
1819
#include <opencv2/opencv.hpp>
1920
#endif

example/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export default function App() {
7272
);
7373

7474
for (const contour of contours) {
75-
const { area } = OpenCV.invoke('contourArea', contour, false);
75+
const { value: area } = OpenCV.invoke('contourArea', contour, false);
7676

7777
if (area > 3000) {
7878
const rect = OpenCV.invoke('boundingRect', contour);

src/constants/Core.ts

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
export enum CovarFlags {
2+
COVAR_SCRAMBLED = 0,
3+
COVAR_NORMAL = 1,
4+
COVAR_USE_AVG = 2,
5+
COVAR_SCALE = 4,
6+
COVAR_ROWS = 8,
7+
COVAR_COLS = 16,
8+
}
9+
10+
export enum QuatAssumeType {
11+
QUAT_ASSUME_NOT_UNIT = 'QUAT_ASSUME_NOT_UNIT',
12+
QUAT_ASSUME_UNIT = 'QUAT_ASSUME_UNIT',
13+
}
14+
15+
export enum DecompTypes {
16+
DECOMP_LU = 0,
17+
DECOMP_SVD = 1,
18+
DECOMP_EIG = 2,
19+
DECOMP_CHOLESKY = 3,
20+
DECOMP_QR = 4,
21+
DECOMP_NORMAL = 16,
22+
}
23+
24+
export enum BorderTypes {
25+
BORDER_CONSTANT = 0,
26+
BORDER_REPLICATE = 1,
27+
BORDER_REFLECT = 2,
28+
BORDER_WRAP = 3,
29+
BORDER_REFLECT_101 = 4,
30+
BORDER_TRANSPARENT = 5,
31+
BORDER_REFLECT101 = BORDER_REFLECT_101,
32+
BORDER_DEFAULT = BORDER_REFLECT_101,
33+
BORDER_ISOLATED = 16,
34+
}
35+
36+
export enum CmpTypes {
37+
CMP_EQ = 0,
38+
CMP_GT = 1,
39+
CMP_GE = 2,
40+
CMP_LT = 3,
41+
CMP_LE = 4,
42+
CMP_NE = 5,
43+
}
44+
45+
export enum DftFlags {
46+
DFT_INVERSE = 1,
47+
DFT_SCALE = 2,
48+
DFT_ROWS = 4,
49+
DFT_COMPLEX_OUTPUT = 16,
50+
DFT_REAL_OUTPUT = 32,
51+
DFT_COMPLEX_INPUT = 64,
52+
DCT_INVERSE = DFT_INVERSE,
53+
DCT_ROWS = DFT_ROWS,
54+
}
55+
56+
export enum GemmFlags {
57+
GEMM_1_T = 1,
58+
GEMM_2_T = 2,
59+
GEMM_3_T = 4,
60+
}
61+
62+
export enum NormTypes {
63+
NORM_INF = 1,
64+
NORM_L1 = 2,
65+
NORM_L2 = 4,
66+
NORM_L2SQR = 5,
67+
NORM_HAMMING = 6,
68+
NORM_HAMMING2 = 7,
69+
NORM_TYPE_MASK = 7,
70+
NORM_RELATIVE = 8,
71+
NORM_MINMAX = 32,
72+
}
73+
74+
export enum ReduceTypes {
75+
REDUCE_SUM = 0,
76+
REDUCE_AVG = 1,
77+
REDUCE_MAX = 2,
78+
REDUCE_MIN = 3,
79+
}
80+
81+
export enum RotateFlags {
82+
ROTATE_90_CLOCKWISE = 0,
83+
ROTATE_180 = 1,
84+
ROTATE_90_COUNTERCLOCKWISE = 2,
85+
}

0 commit comments

Comments
 (0)