Я делаю метод в Android Studio, который реализует кластеризацию Kmeans на изображении. Часть процесса заключается в изменении изображения мата следующим образом
img.reshape(1, img.rows()* img.cols())
и преобразование изображения в CV_32F. Когда я пытаюсь отобразить изображение, мое приложение вылетает.
После нескольких минут, пытаясь выяснить, в чем дело, я обнаружил, что img.reshape () является причиной сбоя по неизвестным причинам. Я пытался исследовать это, но я видел только пару ответов, где они сказали, что мне просто нужно преобразовать изображение обратно в исходную форму, выполнив:
img.convertTo(img, CV_U8)
img.reshape(3, img.rows());
, но это все равно приводит к сбою моего приложения и не отображает изображение циновки в ImageView.
Вот полный код:
public Bitmap kmeans(Bitmap bitmap){
int K = 8;
int maxIterations = 10;
Mat img = new Mat();
Utils.bitmapToMat(bitmap, img);
Mat m = img.reshape(1, img.rows() *img.cols());
m.convertTo(m, CvType.CV_32F);
Mat bestLabels = new Mat(m.rows(), 1, CV_8U);
Mat centroids = new Mat(K, 1, CvType.CV_32F);
Core.kmeans(m, K, bestLabels,
new TermCriteria(TermCriteria.COUNT | TermCriteria.EPS, maxIterations, 1E-5),
1, Core.KMEANS_RANDOM_CENTERS, centroids);
List<Integer> idx = new ArrayList<>(m.rows());
Converters.Mat_to_vector_int(bestLabels, idx);
Mat imgMapped = new Mat(m.size(), m.type());
for(int i = 0; i < idx.size(); i++) {
Mat row = imgMapped.row(i);
centroids.row(idx.get(i)).copyTo(row);
}
Mat output_image = imgMapped.reshape(3, img.rows());
output_image.convertTo(output_image,CV_8U);
Utils.matToBitmap(output_image, bitmap);
return bitmap;
}