c++ - 使用标志 KMEANS_USE_INITIAL_LABELS 时是否有/如何解决 OpenCV C++ kmeans() 中的这个错误?
问题描述
当我在 OpenCV++ kmeans(参见示例代码)中使用此标志时,该函数根本不会更改标签。使用 KMEANS_RANDOM_CENTERS 或 KMEANS_PP_CENTERS 确实有效,只有当我使用此标志时才会出现问题。增加尝试次数不会改变任何事情。我正在使用 OpenCV 版本 3.45(不允许更高版本)和 Visual Studio Community 17 来编译此代码。(未指定 C++ 标准。)
int main() {
//voxelReconstruct();
vector<Point2f> ground_voxels;
for (int i = 0; i < 20; i++) ground_voxels.push_back(Point2f(rand() % 100, rand() % 100));
vector<int> voxel_labels;
for (int i = 0; i < 20; i++) voxel_labels.push_back(rand() % 4);
vector<int> old_labels;
for (int i = 0; i < 20; i++) old_labels.push_back(voxel_labels[i]);
kmeans(ground_voxels, 4, voxel_labels, TermCriteria(2, 5000, 0.0001), 1, KMEANS_USE_INITIAL_LABELS);
for (int i = 0; i < 20; i++) if (voxel_labels[i] != old_labels[i]) cout << "okay\n";
cout << "done\n";
waitKey(100000);
return 0;
}
解决方案
kmeans(.., 1,.. )。设置尝试次数 >= 1,例如尝试次数 = 100。什么是尝试次数?用于指定使用不同初始标签执行算法的次数的标志。该算法返回产生最佳紧凑性的标签(请参阅最后一个函数参数)。
设置 TermCriteria 类型:TermCriteria::COUNT | 每股收益。为什么只使用 epsilon 而使用 set 和迭代?
推荐阅读
- python-3.x - 如何删除嵌套的 for 循环并使用 numpy 数组 insead
- swift - 检查返回值是否为整数,如果是,则在 Swift 中返回字符串
- julia - 如何在 Julia 中检查项目清单是否完整?
- redhat - Red Hat 的订阅管理器是如何工作的?
- pytorch - 加载操作后 Pytorch GPU 内存增加
- flutter - Flutter/Dart:任何语言的语音到文本(离线和连续)
- azure - 如何防止创建其他 Azure Active Directory 租户/目录?
- isabelle - 如何使用 Isabelle/HOL 证明以下陈述?
- c# - Http PostAsJsonAsync 获取空参数(DTO)
- node.js - 为什么我无法从 JSON 对象中获取一些键值?