gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:08:19 28 4
gpt4 key购买 nike

我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com