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