OpenCV学习——图像的BGR格式解读
1. opencv读取的图片数据格式
opencv读取的图片数据格式为numpy的nparray格式。
一张二维图片是由像素点构成,如下图所示:
其中行与列确定了像素点的位置,值确定了颜色,通常为三通道RGB值
举例:[125,225,3]
对应维度信息表示:
[图片高度,图片宽度,像素BGR值]
[数组行数,数组列数,像素BGR值]
[Height,Width,Channels]
Ps:opencv读取的图片数值为BGR格式,与PIL库读取图片得到的RGB格式不同,因此如果用其他库的imshow函数来显示图片,图片的颜色会发生变化
2. BGR含义
B:Blue
G:Green
R:Red
分别代表三原色,不同的颜色由不同的三原色配比得到。因此,在一张二维图片的像素点数组中,确定行与列后,还会获取该位置三原色的数值,用以表示颜色。
Ps:像素值大小[0,255]
我的理解:因为部分例如我熟悉的yolov5需要用到的就是BGR值。所以获取到的图片必须得转成RGB值传入才能进行识别。特别是从TextureView表面纹理获取到的图片,它不是nv21的byte[]格式,而是ARGB_8888的Bitmap。我们只需要将bitmap直接转换成BGR格式存储即可,不需要先将其转换成bmp->nv21->BGR,这中间多了一层。bmp->BGR.
在TextureView里面的onSurfaceTextureUpdated方法中,TextureView.getBitmap方法可用于获取包含当前帧的Bitmap对象,它的格式为 Bitmap.Config.ARGB_8888。然后将Bitmap对象传递给toBgr方法以获取BGR像素数据。此数据可以用于您的图像处理需求。以下为对应的bmp->BGR方法:
public static byte[] toBgr(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
byte[] data = new byte[width * height * 3];
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
for (int i = 0; i < pixels.length; i++) {
int pixel = pixels[i];
int r = Color.red(pixel);
int g = Color.green(pixel);
int b = Color.blue(pixel);
data[3 * i] = (byte) b;
data[3 * i + 1] = (byte) g;
data[3 * i + 2] = (byte) r;
}
return data;
}
获取到BGR格式保存的byte[]数组后,即可以直接使用于一些算法byte[]输入。这些当然是视不同的算法所需的格式而定。而我这边主要是yolov5需要到。
这篇文章引用了opencv获取图片的BGR的一些理解,主要为我个人理解以及深入学习使用。如有冒犯,还请联系我,我将相关内容删除