OpenCV4Android Kmean无法按预期工作

时间:2015-03-24 14:44:52

标签: opencv image-processing k-means opencv4android

此代码应为中心垫提供3行和clusterCount列数

    Mat reshaped_image = imageMat.reshape(1, imageMat.cols()*imageMat.rows());
    Mat reshaped_image32f = new Mat();
    reshaped_image.convertTo(reshaped_image32f, CvType.CV_32F, 1.0 / 255.0);

    Mat labels = new Mat();
    TermCriteria criteria = new TermCriteria(TermCriteria.COUNT, 100, 1);
    Mat centers = new Mat();
    int clusterCount = 5, attempts = 1;
    Core.kmeans(reshaped_image32f, clusterCount, labels, criteria, attempts, Core.KMEANS_PP_CENTERS, centers);

我在C中尝试了相同的代码,并获得了3行和clusterCount列数的中心Mat。

但是在java中,Core.kmeans返回了4列和簇的行数。

centers.reshape(3);

所以现在重塑功能不适用于中心,因为行数取决于簇大小。在C中,行数总是不变的,即3。

所以在java中它会给出错误

  

矩阵的行数不能除以新的行数

有人可以找出问题所在。我甚至尝试了this,这与我的代码类似并且出现了同样的错误。

参考C代码:

    cv::Mat reshaped_image = image.reshape(1, image.cols * image.rows);
    cv::Mat reshaped_image32f;
    reshaped_image.convertTo(reshaped_image32f, CV_32FC1, 1.0 / 255.0);

    cv::Mat labels;
    int cluster_number = 5;
    cv::TermCriteria criteria(cv::TermCriteria::COUNT, 100, 1);
    cv::Mat centers;
    cv::kmeans(reshaped_image32f, cluster_number, labels, criteria, 1, cv::KMEANS_PP_CENTERS, centers);

1 个答案:

答案 0 :(得分:1)

最后它起作用了: -

我使用bitmapToMat函数将位图转换为Mat,该函数返回RGBA图像。所以中心有4列而不是3列。

如果要将位图转换为Mat,如果需要BGR图像,请执行此操作

    Mat imageMat = new Mat();
    Utils.bitmapToMat(bitmap, imageMat);

    Imgproc.cvtColor(imageMat, imageMat, Imgproc.COLOR_BGRA2BGR);

干杯