我尝试找到轮廓并用它制作五个簇。我找到了轮廓:
Imgproc.findContours(bw.clone(), contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
我想使用kmeans算法来制作五个群集。但我不知道,findContours函数和kmeans函数之间的步骤。
Core.kmeans(samples32f, 5, labels, criteria, 1, Core.KMEANS_PP_CENTERS, centers);
kmeans函数的第一个参数是带浮点CvType和点的Mat。
如何将轮廓转换为点或我该如何进行?
P.S。有15个轮廓代表15圈。
答案 0 :(得分:0)
我解决了这个问题!非常感谢你的提示。
我不明白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找到骰子的中心。
抱歉英语不好......