Android OpenCV(一):图片读取与写入

4,191 阅读2分钟

Mat对象

Mat是OpenCV中用来存储图像信息的内存对象。Mat对象存储图片的像素信息,以及宽、高、类型、维度、大小、深度等属性。比如下面这张26*24 三通道图片原图,实际的像素存储内容如下

26*24*3
26*24*3

对应的部分信息为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)

加载效果

imread
imread

写入

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)

源码

github.com/onlyloveyd/…

Lena图片

www.ece.rice.edu/~wakin/imag…

本文使用 mdnice 排版