DenisN03 0 Report post Posted February 20, 2018 Создаю андроид программу которая с использованием opencv(dnn) загружает модель нейронной сети Enet и производит сегментацию входного изображения. Все идет гладко до обработки полученных результатов. На языке python обработка производится довольно просто - в цикле проходимся по матрице пикселей и в зависимости от значения присваиваем ему цвет. В java все не так: после работы возвращается объект типа Mat со следующими параметрами: res = Mat [ -1*-1*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0x7f3e56fff160, dataAddr=0x7f3e44806000 ] res.total() = 1036800 res.channels() = 1 res.size() = 6x1 res.dims() = 4 res.cols() = -1 res.rows() = -1 Более того если все таки достать(http://answers.opencv.org/question/175676/javaandroid-access-4-dim-mat-planes/) значения пикселей из полученного результата то они не соответствуют ожиданиям. Т.е. каждому классу соответствует число например если 5 классов то возвращаются числа от 0 до 4(так работает на python). Здесь же мне возвращаются числа вида: -26.287221908569336, -14.588539123535156, -7.386473655700684, 1.4765703678131104, 15.550891876220703. Кто нибудь знает как преодолеть данную проблему? Почему объект Mat возвращает не те значения? Share this post Link to post Share on other sites
Smorodov 578 Report post Posted February 20, 2018 Argmax(-26.287221908569336, -14.588539123535156, -7.386473655700684, 1.4765703678131104, 15.550891876220703)=4 Share this post Link to post Share on other sites
DenisN03 0 Report post Posted February 20, 2018 Я нашел функцию которая обрабатывает результат, но она для языка С++. Можете подсказать как ее преобразовать в Java? static void colorizeSegmentation(const Mat &score, Mat &segm) { const int rows = score.size[2]; const int cols = score.size[3]; const int chns = score.size[1]; Mat maxCl = Mat::zeros(rows, cols, CV_8UC1); Mat maxVal(rows, cols, CV_32FC1, score.data); for (int ch = 1; ch < chns; ch++) { for (int row = 0; row < rows; row++) { const float *ptrScore = score.ptr<float>(0, ch, row); uint8_t *ptrMaxCl = maxCl.ptr<uint8_t>(row); float *ptrMaxVal = maxVal.ptr<float>(row); for (int col = 0; col < cols; col++) { if (ptrScore[col] > ptrMaxVal[col]) { ptrMaxVal[col] = ptrScore[col]; ptrMaxCl[col] = (uchar)ch; } } } } segm.create(rows, cols, CV_8UC3); for (int row = 0; row < rows; row++) { const uchar *ptrMaxCl = maxCl.ptr<uchar>(row); Vec3b *ptrSegm = segm.ptr<Vec3b>(row); for (int col = 0; col < cols; col++) { ptrSegm[col] = colors[ptrMaxCl[col]]; } } } Share this post Link to post Share on other sites
Smorodov 578 Report post Posted February 20, 2018 Это попиксельный argmax по слоям выходной матрицы, с последующей раскраской. Не знаю как на java будет, давно не использую. Share this post Link to post Share on other sites