当使用标志KMEANS_USE_INITIAL_LABELS时,是否有/如何在OpenCV C ++ kmeans()中解决此错误?

问题描述 投票:0回答:1

当我在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++ opencv xdebug k-means flags
1个回答
0
投票
  1. kmeans(..,1,..)。设置尝试> = 1,例如尝试= 100.是什么尝试?用于指定使用不同初始标记执行算法的次数的标志。该算法返回产生最佳紧凑性的标签(参见最后一个函数参数)。
  2. 设置TermCriteria类型:TermCriteria :: COUNT | EPS。为什么你只使用epsilon而是设置和迭代?
© www.soinside.com 2019 - 2024. All rights reserved.