IllegalArgumentException: ширина и высота должны быть> 0 - ошибка при загрузке изображения с помощью Imgcodecs.imread - PullRequest
1 голос
/ 28 мая 2020

Я использую Imgcodecs.imread для загрузки изображения из галереи телефона, чтобы выполнить сегментацию этого изображения. Однако при создании растрового изображения для отображения его на экране я получал error: IllegalArgumentException: width and height must be> 0.. Вскоре я понял, что Imgcodecs.imread не открывает изображение правильно, потому что я использовал журнал для просмотра выходных данных переменной. Как показано ниже.

// Load the image
   val srcOriginal = Imgcodecs.imread(currentPhotoPath)
    val src: Mat = srcOriginal.clone()
    Log.i("teste", src.toString())
    Log.i("teste", srcOriginal.toString())
    Log.i("teste", src.rows().toString()+"\n"+ src.cols())
    // Create a blank image of zeros (same dimension as img)
    // It should be grayscale (1 color channel)
    val markers = Mat.zeros(srcOriginal.rows(), srcOriginal.cols(), CvType.CV_32F)

    // This step is manual. The goal is to find the points
    // which create the result we want. I suggest using a
    // tool to get the pixel coordinates.

    // Dictate the area of interest
    for(x in my_canvas.pointsToDrawX.indices) {
            markers.put(
                my_canvas.pointsToDrawX.get(x).toInt(),
                my_canvas.pointsToDrawY.get(x).toInt(),
                255.0
            )
    }

    val src1 = srcOriginal.clone()
    val bmpOut = Bitmap.createBitmap(src1.cols(), src1.rows(), Bitmap.Config.RGB_565)
    //Create Bitmap
    Utils.matToBitmap(src1, bmpOut)
    image.setImageBitmap(bmpOut)

Выходной журнал:

enter image description here

Output error:

введите описание изображения здесь

почему Imgcodecs.imread не открывает изображение правильно?

1 Ответ

3 голосов
/ 28 мая 2020

Вам необходимо добавить права на чтение и запись файлов. Для этого вы можете использовать библиотеки: реализация 'com.tbruyelle.rxpermissions2: rxpermissions: 0.9.4@aar' и реализация "io.reactivex.rxjava2: rxandroid: 2.0.1". При этом при открытии изображения вы проверяете, есть ли у вас разрешение на запись и чтение, используя приведенный ниже код:

private fun tryOpenFile() {

    rxPermissions
        .request(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        .subscribe({ granted ->
            if (granted) {
                val getPictureIntent = Intent(Intent.ACTION_GET_CONTENT).apply {
                    type = "image/*"}
                val pickPictureIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
                val chooserIntent = Intent.createChooser(getPictureIntent, "Select Image")
                    .apply { putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(pickPictureIntent)) }
                startActivityForResult(chooserIntent, PICK_IMAGE_INTENT)
            } else {
                Toast.makeText(this@MainActivity, "App needs permission to read/write external storage", Toast.LENGTH_SHORT).show()
            }
        })
        .addTo(disposables)

}

Надеюсь, это сработает.

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