@@ -106,8 +106,14 @@ NAN_METHOD(Core::Kmeans) {
106
106
FF_METHOD_CONTEXT (" Core::Kmeans" );
107
107
108
108
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
+
111
117
112
118
FF_ARG_INT (1 , int k);
113
119
FF_ARG_INSTANCE (2 , cv::TermCriteria termCriteria, TermCriteria::constructor, FF_UNWRAP_TERMCRITERA_AND_GET);
@@ -116,17 +122,40 @@ NAN_METHOD(Core::Kmeans) {
116
122
117
123
std::vector<int > labels;
118
124
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
+
121
140
FF_OBJ ret = FF_NEW_OBJ ();
122
141
FF_PACK_ARRAY (jsLabels, labels);
123
142
Nan::Set (ret, FF_NEW_STRING (" labels" ), jsLabels);
124
143
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));
128
150
}
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
+
130
159
FF_RETURN (ret);
131
160
}
132
161
0 commit comments