@@ -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
0 commit comments