android-openCV中无法将Bitmap转换为Mat

android-openCV中无法将Bitmap转换为Mat
android-openCV中无法将Bitmap转换为Mat

android-openCV中无法将Bitmap转换为Mat

今天遇见了一个很让人郁闷的问题,查了一个下午还是没有查出根本原因,但是或多或少还是有一点点小的收获。下面来说下我遇到的问题。android-openCV中将Bitmap转换为Mat的方法是

org.opencv.core.MatdstMat = new Mat(); dstMat = Utils.bitmapToMat(dstBmp);这两条语句即可,如果dstBmp的获取方式是:

1.dstBmp = BitmapFactory.decodeResource(getResources(), R.drawable.psu);

则可以将其转换为Mat类型。

但是如果获取dstBmp的方式是:

2. InputStream is = getAssets().open("colorful/5.jpg");

dstBmp = BitmapFactory.decodeStream(is);

则不能成功转换为相应的Mat,所谓的相应的Mat,是说和你传入的位图像素信息是一样的,如果位图的获取方式是第二种。那么你的mat将是一个new 出来的“空”Mat,里面没有对应位图的信息,而且不会报错。让人很郁闷。

还有一种情况也不会让你转换为相应的Mat,那就是:你通过第一种方法获取dstBmp,然后对其做矩阵变化,如下:

Matrix matrix = new Matrix();

matrix.postScale(scaleWidth, scaleHeight);

dstBmp = Bitmap.createBitmap(dstBmp , 0, 0, dstW,dstH, matrix, false);然后dstBmp就能在转换为相应的Mat了。

实在是不知道原因,如有高手看到此贴,请解答下。感谢!

PS:有两种方法可以解决上面2种情况的dstBmp无法转换为Mat的方法,但是不知道效率如何:方法如下:

1.

intdstBmpW = dstBmp.getWidth();

intdstBmpH = dstBmp.getHeight();

创建一个4通道CV_32SC类型的大小为dstBmp宽高的dstMat。(因为CV_32SC内像素的类型是int[]型,而java的getPixels方法获得的像素就是int[]型)

Mat dstMat = new Mat(dstBmpH ,dstBmpW ,CvType.CV_32SC4, new Scalar(0));

//创建一个int[] overlayPixels数组用来存放dstBmp像素

int[] dstPixels = new int[dstBmpH * dstBmpW];

//将dstBmp的像素填充到dstPixels数组中

dstBmp.getPixels(dstPixels , 0, overlayW, 0, 0, overlayW, overlayH);

//最后在将这个像素数组写入到dstMat中,这样Mat就有值了。

dstMat .put(0, 0, dstPixels );

2.Bitmap copydstBmp= dstBmp.copy(Config.ARGB_8888, false);直接通过copy语句复制一张新图。这样就可以把这张新图转换为Mat了。

注意:

(如果你通过dstBmp = BitmapFactory.decodeResource(getResources(), R.drawable.psu);获得的bitmap也不能转换为Mat,那么请你在AndroidManifest.xml文件下查看你的最小sdk版本

默认的最小sdk版本是和你建的模拟器版本对应,Android 1.5 对应3,Android 1.6 对应4,Android 2.1 对应7,Android2.2对应8 ,Android 2.3.3 对应10,等等。。。当用户指定这个值后,Android 系统会用这个指定的值对应的SDK 版本去编译你的应用程序。)只有将这个值设置为3,才可以成功转换为Mat。(判断是否将bitmap成功转换为相应的Mat,是在debug中看转换后的mat是否有对应图片的信息,入通道数,宽高等等)如图:

版本为8时,Mat未转换成功

版本为3时,Mat转换成功

使用Bitmap copydstBmp= dstBmp.copy(Config.ARGB_8888, false);直接通过copy语句复制一张新图。这样不管SDK的最小版本是多少都可以把这张新图转换为Mat。

相关主题
相关文档
最新文档