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

Commit 1aa92cd

Browse files
committed
1 parent 240bd04 commit 1aa92cd

File tree

3 files changed

+54
-13
lines changed

3 files changed

+54
-13
lines changed

cc/core/Point.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,27 @@ class Point : public Nan::ObjectWrap {
4646
}
4747
return jsPts;
4848
}
49-
50-
static void unpackJSPoint3Array(std::vector<cv::Point3d> &pts, v8::Local<v8::Array> jsPts) {
49+
50+
template<typename type>
51+
static v8::Local<v8::Array> packJSPoint3Array(std::vector<cv::Point3_<type>> pts) {
52+
v8::Local<v8::Array> jsPts = Nan::New<v8::Array>(pts.size());
53+
for (uint i = 0; i < jsPts->Length(); i++) {
54+
v8::Local<v8::Object> jsPt3 = FF_NEW_INSTANCE(Point3::constructor);
55+
FF_UNWRAP_PT3_AND_GET(jsPt3) = pts.at(i);
56+
jsPts->Set(i, jsPt3);
57+
}
58+
return jsPts;
59+
}
60+
61+
template<typename type>
62+
static void unpackJSPoint3Array(std::vector<cv::Point3_<type>> &pts, v8::Local<v8::Array> jsPts) {
5163
for (uint i = 0; i < jsPts->Length(); i++) {
5264
v8::Local<v8::Object> obj = Nan::To<v8::Object>(jsPts->Get(i)).ToLocalChecked();
5365
double x, y, z;
5466
FF_DESTRUCTURE_JSPROP_REQUIRED(obj, x, NumberValue)
5567
FF_DESTRUCTURE_JSPROP_REQUIRED(obj, y, NumberValue)
5668
FF_DESTRUCTURE_JSPROP_REQUIRED(obj, z, NumberValue)
57-
pts.push_back(cv::Point3d(x, y, z));
69+
pts.push_back(cv::Point3_<type>(x, y, z));
5870
}
5971
};
6072
};

cc/core/core.cc

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,14 @@ NAN_METHOD(Core::Kmeans) {
106106
FF_METHOD_CONTEXT("Core::Kmeans");
107107

108108
FF_ARG_ARRAY(0, FF_ARR jsData);
109-
std::vector<cv::Point2f> data;
110-
Point::unpackJSPoint2Array<float>(data, jsData);
109+
110+
if (jsData->Length() < 1) {
111+
FF_THROW("expected data to contain at least 1 element");
112+
}
113+
114+
FF_VAL data0 = jsData->Get(0);
115+
116+
111117

112118
FF_ARG_INT(1, int k);
113119
FF_ARG_INSTANCE(2, cv::TermCriteria termCriteria, TermCriteria::constructor, FF_UNWRAP_TERMCRITERA_AND_GET);
@@ -116,17 +122,40 @@ NAN_METHOD(Core::Kmeans) {
116122

117123
std::vector<int> labels;
118124
cv::Mat centersMat;
119-
cv::kmeans(data, k, labels, termCriteria, attempts, flags, centersMat);
120-
125+
126+
if (FF_IS_INSTANCE(Point2::constructor, data0) || FF_IS_INSTANCE(Vec2::constructor, data0)) {
127+
std::vector<cv::Point2f> data;
128+
Point::unpackJSPoint2Array(data, jsData);
129+
cv::kmeans(data, k, labels, termCriteria, attempts, flags, centersMat);
130+
}
131+
else if (FF_IS_INSTANCE(Point3::constructor, data0) || FF_IS_INSTANCE(Vec3::constructor, data0)) {
132+
std::vector<cv::Point3f> data;
133+
Point::unpackJSPoint3Array(data, jsData);
134+
cv::kmeans(data, k, labels, termCriteria, attempts, flags, centersMat);
135+
}
136+
else {
137+
FF_THROW("unknowned input data type");
138+
}
139+
121140
FF_OBJ ret = FF_NEW_OBJ();
122141
FF_PACK_ARRAY(jsLabels, labels);
123142
Nan::Set(ret, FF_NEW_STRING("labels"), jsLabels);
124143

125-
std::vector<cv::Point2f> centers;
126-
for (int i = 0; i < centersMat.rows; i++) {
127-
centers.push_back(cv::Point2f(centersMat.at<float>(i, 0), centersMat.at<float>(i, 1)));
144+
if (FF_IS_INSTANCE(Point2::constructor, data0) || FF_IS_INSTANCE(Vec2::constructor, data0)) {
145+
std::vector<cv::Point2f> centers;
146+
for (int i = 0; i < centersMat.rows; i++) {
147+
centers.push_back(cv::Point2f(centersMat.at<float>(i, 0), centersMat.at<float>(i, 1)));
148+
}
149+
Nan::Set(ret, FF_NEW_STRING("centers"), Point::packJSPoint2Array<float>(centers));
128150
}
129-
Nan::Set(ret, FF_NEW_STRING("centers"), Point::packJSPoint2Array<float>(centers));
151+
else if (FF_IS_INSTANCE(Point3::constructor, data0) || FF_IS_INSTANCE(Vec3::constructor, data0)) {
152+
std::vector<cv::Point3f> centers;
153+
for (int i = 0; i < centersMat.rows; i++) {
154+
centers.push_back(cv::Point3f(centersMat.at<float>(i, 0), centersMat.at<float>(i, 1), centersMat.at<float>(i, 2)));
155+
}
156+
Nan::Set(ret, FF_NEW_STRING("centers"), Point::packJSPoint3Array<float>(centers));
157+
}
158+
130159
FF_RETURN(ret);
131160
}
132161

test/tests/core/core.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ describe('core', () => {
129129
const ret = cv.kmeans(points3, k, termCriteria, attempts, flags);
130130

131131
const l0 = ret.labels[0];
132-
const l1 = ret.labels[1];
133-
const l2 = ret.labels[2];
132+
const l1 = ret.labels[2];
133+
const l2 = ret.labels[4];
134134
expect(ret.centers[l0].x).to.equal(255);
135135
expect(ret.centers[l0].y).to.equal(0);
136136
expect(ret.centers[l0].z).to.equal(0);

0 commit comments

Comments
 (0)