具有轮廓的群集,Android,OpenCV

时间:2016-04-10 00:24:30

标签: android opencv cluster-computing

我尝试找到轮廓并用它制作五个簇。我找到了轮廓:

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圈。

1 个答案:

答案 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找到骰子的中心。

抱歉英语不好......