如何使用OpenCV处理自定义相机拍摄的图片

时间:2018-12-06 07:45:26

标签: android opencv camera

我正在Android上使用OpenCV,我想使用OpenCV处理自定义相机拍摄的照片,下面是我的代码:

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) 引发的异常:

{{1}}

3 个答案:

答案 0 :(得分:1)

我解决了这个问题,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);

答案 1 :(得分:0)

当您仔细查看错误消息时,核心部分是这样的:

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失败。

答案 2 :(得分:0)

很高兴知道mOriginalBitmap的来源以及它的值。但是,您可以尝试使用Mat默认构造器,它将照顾宽度和高度本身以及类型本身。

mOriginMat = new Mat();

Utils.bitmapToMat(mOriginBitmap,mOriginMat);

如果正确设置了mOriginBitmap,这应该可以工作。