AndroidOpenCV(一):读取和写入图片

Mat对象

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

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

写入

Imgcodes.imwrite

通过imwrite方法将Mat对象保存至指定文件

第一个参数表示被写入的文件路径

第二个参数表示待写入的Mat对象。

一般情况下,只有8位单通道图片和BGR通道顺序的三通道图片可用此方法保存。使用imwrite可以保存带有Alpha通道的PNG图像。为此,需要创建 8位(或16位)4通道图像BGRA,其中alpha通道位于最后,完全透明的像素应将alpha设置为0,完全不透明的像素应将alpha设置为255/65535。还有一些其他情况如下表所示:

类型扩展名
CV_16UPNG,JPEG2000,TIFF
CV_32FPFM,OpenEXR,Radiance HDR
CV_32FC3LogLuv高动态范围编码(每像素4个字节)

基本使用

val file =
    File(Environment.getExternalStorageDirectory().path + File.separator + "${System.currentTimeMillis()}.jpg")
if (!file.exists()) {
    file.createNewFile()
}
Imgcodecs.imwrite(file.path, source)

源码

https://github.com/onlyloveyd/LearningAndroidOpenCV

Lena图片

https://www.ece.rice.edu/~wakin/images/

onlyloveyd CSDN认证博客专家 Android Kotlin OpenCV
个人公众号【OpenCV or Android】,热爱Android、Kotlin、Flutter和OpenCV。毕业于华中科技大学计算机专业,曾就职于华为武汉研究所。目前在三线小城市生活,专注技术与研发。
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页