为什么RGBA位图需要3x3阵列来存储1个像素?如何避免这种情况?

问题描述 投票:0回答:1

我有一个1x1 jpg图像,由一个红色组成。

我以这种方式从drawable图像(Android)创建一个位图:

Bitmap bitmap_image = BitmapFactory.decodeResource(getResources(), R.drawable.onebyonered);

但是,在位图输出3上调用getWidth()getHeight()

然后我将位图转换为OpenCV矩阵:

Mat matrix = new Mat(1, 1, CvType.CV_64FC1);
// System.out.println(matrix);
Utils.bitmapToMat(bitmap_image, matrix);
// System.out.println(matrix);
System.out.println(matrix.dump());

第一个print语句返回Mat [ 1*1*CV_64FC1, ...,第二个print语句返回Mat [ 3*3*CV_8UC4, ...,矩阵转储(转换为字符串)显示:

[255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255;
255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255;
255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255]

使用以下方法对其进行灰度化:

Imgproc.cvtColor(matrix, matrix, Imgproc.COLOR_RGBA2GRAY);

产生3x3x1而不是预期的1x1x1:

[ 76,  76,  76;
  76,  76,  76;
  76,  76,  76]

鉴于上面提到的高度和宽度并假设转储应该是RGBA格式 - 为什么需要9个不同的值来表示1像素的单色图像?如何将此3x3x1更改为我想要的1x1x1 [76]?理想情况下,我使用的任何转换技术都应该是可逆的,或者我能够显示位图图像。

java android opencv bitmap opencv4android
1个回答
1
投票

调用getWidth()getHeight()返回3x3,因为系统按照设备密度缩放图像,因此返回错误的大小。将图像放入assets并从那里加载或放入drawable-nodpi文件夹中。

© www.soinside.com 2019 - 2024. All rights reserved.