c++ - 如何使用 KMEANS_USE_INITIAL_LABELS 在 opencv kmeans 中设置初始标签

标签 c++ opencv cluster-analysis k-means

我正在使用 opencv kmeans 对从 convexhull 返回的点进行聚类。

在我的情况下,我会得到 3 分。 在下一个循环中,我想为 kmeans 提供最后找到的 3 个点。 我读到我必须设置 KMEANS_USE_INITIAL_LABELS。

但是如何设置初始标签/点?

这是我目前所拥有的,但它返回错误:

//get all convexhull points and average them in 3 groups
                    int dimensions = 2;
                    float pointsdata[sampleCount*2]; //[] = {1,1, 2,2, 6,6, 5,5, 10,10};

                    int cnt = 0;
                    for(int a=0; a<sampleCount; a++){
                        pointsdata[cnt] = convexHull[a].x;
                        cnt++;
                        pointsdata[cnt] = convexHull[a].y;
                        cnt++;
                    }

                    cv::Mat points;
                    points = cv::Mat(sampleCount,dimensions, CV_32F,pointsdata);

                    int clusterCount = 3; //i want 3 averaged points back

                    cv::Mat labels;
                    labels = cv::Mat(3,1,points.type());
                    labels.at<float>(0,0) = pointA.x;
                    labels.at<float>(0,1) = pointA.y;

                    labels.at<float>(0,2) = pointB.x;
                    labels.at<float>(0,3) = pointB.y;

                    labels.at<float>(0,4) = pointC.x;
                    labels.at<float>(0,5) = pointC.y;

                    cv::Mat centers;
                    centers = cv::Mat(clusterCount, 1, points.type());



                    kmeans(points, 3, labels, cv::TermCriteria(), 2,cv::KMEANS_USE_INITIAL_LABELS, &centers);

更新: 好的,我现在知道标签是指输入簇中点的索引,而不是实际坐标。 所以它应该更像这样。但还是错了。

cv::Mat labels;
                    labels = cv::Mat(3,1,points.type());
                    labels.at<int>(0,0) = labelA;
                    labels.at<int>(0,1) = labelB;
                    labels.at<int>(0,2) = labelC;

最佳答案

初始集群分配的类型必须是 CV_32S 而不是 CV_32F。在matrix.cpp中可以看到其他条件:

CV_Assert( (best_labels.cols == 1 || best_labels.rows == 1) &&
              best_labels.cols*best_labels.rows == N &&
              best_labels.type() == CV_32S &&
              best_labels.isContinuous());

标签的值应在 [0,N) 范围内,其中 N 是行数。

关于c++ - 如何使用 KMEANS_USE_INITIAL_LABELS 在 opencv kmeans 中设置初始标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10114973/

相关文章:

c++ - Bison 警告 : Empty rule for typed nonterminal

c++ - 欧拉计划#11,变量溢出

python - 使用 OpenCV 和 Python 进行立体校正的问题

Python:生成二维点/簇

python - 如何从 Word2Vec 模型中提取向量进行聚类

python - 分配许多简单网络任务的解决方案?

c++ - glDrawElements() 错误地绘制了我的 .obj 模型

c++ - 为什么编译器允许在模板类中使用这个虚函数?

c++ - 错误 : QueryFrame not a member of cv

c++ - 使用 CUDA 7.0/VS2012 C++/CLI/OpenCV 的多线程 CPU 到 GPU