首页 > 解决方案 > 使用标志 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;
}

标签: c++opencvxdebugk-meansflags

解决方案


  1. kmeans(.., 1,.. )。设置尝试次数 >= 1,例如尝试次数 = 100。什么是尝试次数?用于指定使用不同初始标签执行算法的次数的标志。该算法返回产生最佳紧凑性的标签(请参阅最后一个函数参数)。

  2. 设置 TermCriteria 类型:TermCriteria::COUNT | 每股收益。为什么只使用 epsilon 而使用 set 和迭代?


推荐阅读