Для входной строки: «Mat [0 * 0 * CV_32FC1, isCont = true, isSubmat = false, nativeObj = 0x78a0dff700, dataAddr = 0x0]» - матрица заполнения ошибок - PullRequest
2 голосов
/ 28 мая 2020

Я работаю с opencv на android для разработки приложения сегментации изображений, но с алгоритмом водораздела. Я открываю изображение и создаю маску с тем же размером изображения и передаю 0 для всех строк и столбцов этой маски. Однако на следующем шаге, который заключается в go через массив 0 и добавлении в качестве координат в этот массив, у меня есть ошибка:

java.lang.NumberFormatException: For input string: "Mat [0 * 0 * CV_32FC1, isCont = true, isSubmat = false, nativeObj = 0x78a0dff700, dataAddr = 0x0] "

При этом невозможно передать новые значения в массив, может ли кто-нибудь помочь мне с этим?

Код:

// Load the image
val srcOriginal = Imgcodecs.imread(currentPhotoPath)

// Create a blank image of zeros (same dimension as img)
val markers = Mat.zeros(srcOriginal.rows(), srcOriginal.cols(), CvType.CV_32F)

// Example assigning a new value to a matrix index
for (i in 0 until markers.toInt()) {
   markers.put(my_canvas.pointsToDrawY.get(i).toInt(), my_canvas.pointsToDrawY.get(i).toInt(), intArrayOf(0,0,255))
}

Ошибка:

enter image description here

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Итак, я наконец понял проблему. Строка

Mat.zeros(srcOriginal.rows(), srcOriginal.cols(), CvType.CV_32F)

говорит о создании Mat размером srcOriginal.rows() на srcOriginal.cols() пикселей.

Теперь вам нужно l oop через строки и столбцы, чтобы установить их значения цвета в RGB. Другими словами, вы должны установить все значения столбцов для 0-й строки, затем все значения столбцов для 1-й строки и т. Д.

Таким образом, вам нужно l oop дважды, один для строки и один для столбец. Вы можете использовать две петли for. Я извлечу их во встроенную функцию, чтобы потом ими было легче управлять.

// function declaration toplevel / or in class
inline fun loopThrough(rows: Int, cols: Int, block: (Int, Int) -> Unit) {
    for(r in 0 until rows) {
        for (c in 0 until cols) block(r, c)
    }
}

// code here
val rows = srcOriginal.rows()
val cols = srcOriginal.cols()
val markers = Mat.zeros(rows, cols, CvType.CV_32F)

loopThrough(rows, cols) { row, col ->
   markers.put(row, col, intArrayOf(0,0,255))
}
0 голосов
/ 28 мая 2020

Я не думаю, что вы можете использовать markers.toInt () в for l oop. Маркеры - это многомерный массив, который нельзя преобразовать в целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...