在一个项目中调用kmeans(pointsMat, K, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0), 3, KMEANS_RANDOM_CENTERS, centers); 对一组圆点进行分类,发现第二次调用总是出现异常值。然后第3、4、5、等又和第一次结果一样。等到第10、20次又会出现异常值。
经过排查,发现是kmeans函数的问题。这是因为K-means算法在每次运行时,初始聚类中心是随机选择的。如果你想让每次运行的结果一致,可以设置一个随机种子。
高级版本的opencv:
// 设置随机种子 int randomSeed = 42; RNG rng(randomSeed); kmeans(pointsMat, K, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0), 3, KMEANS_RANDOM_CENTERS, centers, rng);
低级版本的opencv:
可能不支持直接传递RNG
对象给kmeans
函数。此时你需要手动设置全局的随机数种子。// 设置随机种子 int randomSeed = 42; theRNG().state = randomSeed; kmeans(pointsMat, K, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0), 3, KMEANS_RANDOM_CENTERS, centers);