OpenCV4Android Kmean не работает должным образом

Этот код должен давать центры мата с 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 и получил центры Mat с 3 строками и количеством столбцов clusterCount.

Но в java Core.km означает, что он возвращает 4 столбца и количество строк в кластере.

centers.reshape(3);

поэтому теперь функция изменения формы не работает в центрах, поскольку количество строк зависит от размера кластера. В C количество строк всегда постоянно, т.е. 3.

поэтому в java выдает ошибку

количество строк матрицы нельзя разделить на новое количество строк

Может кто разобрался в чем проблема. Я даже пробовал это, похожее к моему коду и получил ту же ошибку.

Справочный код 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);

person Ashok Varma    schedule 24.03.2015    source источник


Ответы (1)


Наконец это сработало: -

Я преобразовал растровое изображение в Mat, используя функцию bitmapToMat, которая возвращает изображение RGBA. поэтому центры имеют 4 столбца вместо 3.

Если вы конвертируете растровое изображение в мат и вам нужно изображение BGR, сделайте это

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

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

Ваше здоровье

person Ashok Varma    schedule 24.03.2015