【问题标题】:cluster with contours, Android, OpenCV带有轮廓的集群,Android,OpenCV
【发布时间】:2016-04-11 00:47:17
【问题描述】:

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

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。

如何将轮廓转换为点或者我必须如何进行?

附: 15个轮廓代表15个圆。

【问题讨论】:

  • 那你要集群什么?您不仅要给 kmeans 任意长度的曲线,还要给定大小的特征向量。除非您对“特征提取”有什么特别的想法,否则这里有一个线索:仿射不变傅里叶描述符。
  • 感谢您的回答。我想聚集 5 个骰子的点数。
  • 也许您发布一个示例图像,您可以在上面手动注释所需的结果?

标签: android opencv cluster-computing


【解决方案1】:

我解决了这个问题!感谢 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 找到骰子的中心。

抱歉英语不好...

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2015-02-25
    相关资源
    最近更新 更多