如何使用KMEANS_USE_INITIAL_LABELS在OpenCV KMEANS中设置初始标签
how to set initial labels in opencv kmeans with KMEANS_USE_INITIAL_LABELS
我正在使用OpenCV kmeans来聚类我从凸回得到的点。
就我而言,我将获得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, ¢ers);
更新:好的,我现在知道标签意味着输入集群中点的索引,而不是实际坐标。所以它应该更像这样。但还是错了。
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
。 您可以在矩阵中看到其他条件.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
是行数。
需要为每行分配一个标签。因此,在您的情况下,他们必须分配为:
cv::Mat labels;
labels = cv::Mat(3,1,points.type());
labels.at<int>(0,0) = labelA;
labels.at<int>(1,0) = labelB;
labels.at<int>(2,0) = labelC;
附带说明:您在上述编辑中的代码是错误的。您已分配三行并正在写入三列。
cv::Mat labels;
labels = cv::Mat(sampleCount,1,CV_32S);
for(int i = 0; i < sampleCount; i++)
labels.at<int>(i,0) = 0;
labels.at<int>(position1, 0) = 0;
labels.at<int>(position2, 0) = 1;
labels.at<int>(position3, 0) = 2;
labels 是一个 1*N 或 N*1 整数数组,用于存储样本中每个点的聚类 ID。所以要确保
- 标签大小:1*N 或 N*1(不是 1*K 或 K*1)
- 标签类型:CV_32S,因为它存储集群ID,所以应该是整数 标签
- 范围:标签中的每个元素都在 [0, K)
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 将特征矩阵的向量设置为0
- 如何使用KMEANS_USE_INITIAL_LABELS在OpenCV KMEANS中设置初始标签