我解决了这个问题!感谢 mainactual 的提示。
我不明白kmeans算法的第一个参数需要哪个值。
通过这个Tutorial我分析了问题,找到了正确的方法。
Imgproc.findContours(bw.clone(), contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
Mat samples32final = new Mat(contours.size(), 2, CvType.CV_32F, new Scalar(0));
for (int j = 0 ; j<contours.size(); j++) {
Mat samples32f = new Mat((int) contours.get(j).size().height, 2, CvType.CV_32F, new Scalar(0));
for (int i = 0; i < (int) contours.get(j).size().height; i++) {
samples32f.put(i, 0, contours.get(j).get(i, 0)[0]);
samples32f.put(i, 1, contours.get(j).get(i, 0)[1]);
}
samples32f.reshape((int) contours.get(j).size().height, 2);
Mat labels = new Mat((int) contours.get(j).size().height, 2, CvType.CV_32SC1);
TermCriteria criteria = new TermCriteria(TermCriteria.EPS + TermCriteria.MAX_ITER, 100, 1.0);
Mat centers = new Mat();
Core.kmeans(samples32f, 1, labels, criteria, 10, Core.KMEANS_RANDOM_CENTERS, centers);
samples32final.put(j,0,centers.get(0,0)[0]);
samples32final.put(j,1,centers.get(0,1)[0]);
}
samples32final.reshape(contours.size(), 2);
Mat labels = new Mat(contours.size(), 2, CvType.CV_32SC1);
TermCriteria criteria = new TermCriteria(TermCriteria.EPS + TermCriteria.MAX_ITER, 100, 1.0);
Mat centers = new Mat();
Core.kmeans(samples32final, 5, labels, criteria, 10, Core.KMEANS_PP_CENTERS, centers);
在第一行中找到了图像的轮廓。在第一个 for 循环中,找到簇大小为 1 的每个点的中心,并将中心存储在新的 Mat 中。在 for 循环之后,所有点的中心位置都存储在变量 samples32final 中。
使用此变量,可以使用 kmeans 找到骰子的中心。
抱歉英语不好...