Преобразование Android Bitmap в OpenCV Mat и обратно

Я хотел просто преобразовать растровое изображение из Android в объект Mat для OpenCV. Эта тема часто упоминается в "Переполнение стека". Например:

конвертировать Mat в Bitmap Opencv для Android;

преобразовать Bitmap в Mat после захвата изображения с помощью камеры Android;

templateMatching mattoBitmap opencv для android

Найти еще есть. Я следовал за установками в этих ответах, но я все еще не могу сделать это правильно.

Минимальный код:

//First convert Bitmap to Mat
Mat ImageMat = new Mat ( image.getHeight(), image.getWidth(), CvType.CV_8U, new Scalar(4));
Bitmap myBitmap32 = image.copy(Bitmap.Config.ARGB_8888, true);
Utils.bitmapToMat(myBitmap32, ImageMat);

//Do smth.
Imgproc.cvtColor(ImageMat, ImageMat, Imgproc.COLOR_RGB2GRAY,4);

//Then convert the processed Mat to Bitmap
Bitmap resultBitmap = Bitmap.createBitmap(ImageMat.cols(),  ImageMat.rows(),Bitmap.Config.ARGB_8888);;
Utils.matToBitmap(ImageMat, resultBitmap);

//Set member to the Result Bitmap. This member is displayed in an ImageView
mResult = resultBitmap;

(обратите внимание: изображение представляет собой растровое изображение, предоставленное этим строкам кода)

Ошибки:

08-07 15: 13: 59.188: E/AndroidRuntime (2115): FATAL EXCEPTION: main

08-07 15: 13: 59.188: E/AndroidRuntime (2115): java.lang.NoClassDefFoundError: org.opencv.core.Mat

Но мой импорт:

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;


//OpenCV
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;

Поистине оцените любую помощь. Спасибо DanS

Ответ 1

Вы можете выполнять свою работу только с OpenCV после ее инициализации. Поэтому вам нужно инициализировать его следующим образом:

1.Создание обратного вызова:

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
        case LoaderCallbackInterface.SUCCESS:
            //DO YOUR WORK/STUFF HERE 
            break;
        default:
            super.onManagerConnected(status);
            break;
        }
    }
};

2. Вам нужно инициализировать обратный вызов в методе onResume вашей деятельности:

@Override
    protected void onResume() {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_8, this,
                mOpenCVCallBack);
    }

И вот, я надеюсь, что это было полезно: D

Ответ 2

вы должны добавить OpenCV lib dependecy в свой файл android prj config (properties- > Android- > Library → add [opencv andrid prg])