Как использовать OpenCV для обработки снимков, сделанных камерой Custom - PullRequest
0 голосов
/ 06 декабря 2018

Я использую OpenCV на Android, я хочу использовать OpenCV для обработки снимка, сделанного моей пользовательской камерой, ниже мой код:

//mOriginBitmap is taken by my custom camera.
mOriginMat = new Mat(mOriginBitmap.getHeight(), mOriginBitmap.getWidth(), CvType.CV_8UC4);

Utils.bitmapToMat(mOriginBitmap,mOriginMat);

mDestMat=new Mat(mOriginBitmap.getHeight(), mOriginBitmap.getWidth(), CvType.CV_8UC4);

Imgproc.GaussianBlur(mOriginMat,mDestMat,new Size(3,3),0);

Utils.matToBitmap(mDestMat,mDestBitmap);

mDestImage.setImageBitmap(mDestBitmap);

Заранее спасибо.

Дляболее подробно, ниже - исключение, бросить на Utils.bitmapToMat(mOriginBitmap,mOriginMat);:

com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 
         Caused by: CvException [org.opencv.core.CvException: OpenCV(3.4.4) /build/3_4_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp:38: error: (-215:Assertion failed) AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0 in function 'void Java_org_opencv_android_Utils_nBitmapToMat2(JNIEnv*, jclass, jobject, jlong, jboolean)'
        ]
            at org.opencv.android.Utils.nBitmapToMat2(Native Method)
            at org.opencv.android.Utils.bitmapToMat(Utils.java:93)
            at org.opencv.android.Utils.bitmapToMat(Utils.java:102)
            at com.example.dell.suppercamera.PictureActivity.onGaussianBlur(PictureActivity.java:103)

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Было бы неплохо узнать, откуда взялся mOriginalBitmap, и его значение тоже.Однако вы можете попробовать использовать стандартный конструктор Mat, он позаботится о ширине и высоте и о самом типе.

mOriginMat = new Mat();

Utils.bitmapToMat(mOriginBitmap,mOriginMat);

Это должно работать, если mOriginBitmap установлен правильно.

0 голосов
/ 07 декабря 2018

Я решил, снимок, сделанный камерой Android, - YUV420sp, но для Mat требуется ARGB888, поэтому я использую Imgcodecs.imread метод для загрузки картинки:

File file = new File(getCacheDir(), "text.jpg");
mOriginMat = Imgcodecs.imread(file.getAbsolutePath());
Imgproc.cvtColor(mOriginMat,mOriginMat,Imgproc.COLOR_BGR2RGB);
mDestMat=new Mat(mOriginMat.rows(), mOriginMat.cols(), CvType.CV_8UC4);
Imgproc.GaussianBlur(mOriginMat,mDestMat,new Size(3,3),0);
mDestBitmap = Bitmap.createBitmap(mOriginMat.cols(), mOriginMat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mDestMat,mDestBitmap);
mDestImage.setImageBitmap(mDestBitmap);
0 голосов
/ 06 декабря 2018

Когда вы внимательно посмотрите на сообщение об ошибке, основная часть выглядит так:

Assertion failed) AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0

Здесь описан метод lockPixels: https://developer.android.com/ndk/reference/group/bitmap#group___bitmap_1ga2908d42fa4db286c34b7f8c11f29206f

Поскольку вы не опубликовалиЯ могу только догадываться о коде для вашего пользовательского класса камеры, но я предполагаю, что создаваемое растровое изображение не использует прямой буфер (см. также здесь: https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html),, и это может привести к сбою lockPixels.

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