1

このコードは、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数の列を持つセンターマットが得られました。

しかし、Java では、Core.km は 4 列とクラスター行数を返すことを意味します。

centers.reshape(3);

そのため、行の数はクラスターのサイズに依存するため、reshape 関数はセンターでは機能しません。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);
4

1 に答える 1

1

最後にそれは働いた:-

RGBA イメージを返す bitmapToMat 関数を使用して、ビットマップを Mat に変換しました。そのため、中心には 3 列ではなく 4 列があります。

ビットマップをマットに変換していて、BGR イメージが必要な場合は、これを実行します

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

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

乾杯

于 2015-03-24T17:43:53.817 に答える