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 );
评论0
最新资源