Mat对象
Mat是OpenCV中用来存储图像信息的内存对象。Mat对象存储图片的像素信息,以及宽、高、类型、维度、大小、深度等属性。比如下面这张26*24 三通道图片,实际的像素存储内容如下
对应的部分信息为26x24x3 uint8,即宽26px,高24px,通道数3,类型8位无符号整形。
Mat其实是Matrix(矩阵)的简写,通过矩阵运算,可以实现对图像的操作。
加载图片
Imgcodecs.imread
通过imread方法获取的Mat对象,通道顺序默认为BGR,需要手动转换通道顺序方可正确显示图片。
第一个参数表示文件路径
第二个参数表示加载图片类型
基本用法
val path = Environment.getExternalStorageDirectory().path + File.separator + "lena.png"
val bgr = Imgcodecs.imread(path, Imgcodecs.IMREAD_UNCHANGED)
val bitmap = Bitmap.createBitmap(bgr.width(), bgr.height(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(bgr, bitmap)
复制代码
imread flag
imread flag | 意义 |
---|---|
IMREAD_UNCHANGED = -1 | 无改动 |
IMREAD_GRAYSCALE = 0 | 单通道灰色图像 |
IMREAD_COLOR = 1 | 三通道BGR图像 |
IMREAD_ANYDEPTH = 2 | 不改变图像深度 |
IMREAD_ANYCOLOR = 4 | 以任何可能的颜色格式读取图像 |
IMREAD_LOAD_GDAL = 8 | 使用Gdal驱动程序加载图像 |
IMREAD_REDUCED_GRAYSCALE_2 = 16 | 单通道灰色图像,宽高减半 |
IMREAD_REDUCED_COLOR_2 = 17 | 三通单BGR图像,宽高减半 |
IMREAD_REDUCED_GRAYSCALE_4 = 32 | 单通道灰色图像,宽高为原图1/4 |
IMREAD_REDUCED_COLOR_4 = 33 | 三通单BGR图像,宽高为原图1/4 |
IMREAD_REDUCED_GRAYSCALE_8 = 64 | 单通道灰色图像,宽高为原图1/8 |
IMREAD_REDUCED_COLOR_8 = 65 | 三通单BGR图像,宽高为原图1/8 |
IMREAD_IGNORE_ORIENTATION = 128 | 忽略EXIF的方向标志 |
Utils.bitmapToMat
通过Utils.bitmapToMat方法获取Mat对象。
第一个参数表示输入的Bitmap对象,只支持ARGB_8888和RGB_565两种格式
第二个参数表示输出的Mat对象,表示的图片大小与Bitmap一致,类型为CV_8UC4,通道顺序为RGBA
基本使用
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.lena)
val source = Mat()
Utils.bitmapToMat(bitmap, source)
复制代码
加载效果
写入
Imgcodes.imwrite
通过imwrite方法将Mat对象保存至指定文件
第一个参数表示被写入的文件路径
第二个参数表示待写入的Mat对象。
一般情况下,只有8位单通道图片和BGR通道顺序的三通道图片可用此方法保存。使用imwrite可以保存带有Alpha通道的PNG图像。为此,需要创建 8位(或16位)4通道图像BGRA,其中alpha通道位于最后,完全透明的像素应将alpha设置为0,完全不透明的像素应将alpha设置为255/65535。还有一些其他情况如下表所示:
类型 | 扩展名 |
---|---|
CV_16U | PNG,JPEG2000,TIFF |
CV_32F | PFM,OpenEXR,Radiance HDR |
CV_32FC3 | LogLuv高动态范围编码(每像素4个字节) |
基本使用
val file =
File(Environment.getExternalStorageDirectory().path + File.separator + "${System.currentTimeMillis()}.jpg")
if (!file.exists()) {
file.createNewFile()
}
Imgcodecs.imwrite(file.path, source)
复制代码
源码
Lena图片
本文使用 mdnice 排版