OpenCV(二) Mat 与 Bitmap

4 篇文章 1 订阅
4 篇文章 0 订阅

Mat 对象

  • Mat是OpenCV 中用来存储图像信息的内存对象,当通过Imgcodes.imread()方法从文件读入一个图像文件时,imread方法就会返回Mat对象实例,或者通过Utils.bitmatToMat()方法把bitmap转换成Mat对象。
  • Mat对象中除了存储图像的像素数据以外,还包括了图像的其他属性,具体为宽、高、类型、维度、大小、深度等。当你需要这些信息时,可以通过相关的API来获取这些基本图像属性。

加载图像与读取基本信息

  • OpenCV 通过imread来加载图像,默认时候加载的是三通道顺序为RGB的彩色图像,还可以通过以下代码指定加载为彩色图像:

    Mat mat = Imgcodecs.imread(fileUri.getPath(),Imgcodes.IMREAD_COLOR);

    //IMREAD_UNCHANGED=-1 表示不改变加载图像类型,可以包含透明通道
    //IMREAD_GRAYSCALE=0 表示加载的图像为灰度图像
    //IMREAD_COLOR=1 表示加载图像为彩色图像

    int width = src.cols();//获取图片的宽
    int height = src.rows();//获取图片的高
    int dims = src.dims();//获取图片维度
    int channels = src.channels();//获取图片的通道数
    int depth = src.depth();//获取图片的深度
    int type = src.type();//获取图片的类型
  • 其中特别注意的是通道数、图像深度与图像类型、OpenCV加载Mat类型图像对象。常见的通道数目有1、3、4,分别对应于单通道、三通道、四通道,其中四通道中通常会有透明通道数据。图像深度表示每个通道灰度值所占的大小,图像深度与类型密切相关。其中,U表示无符号整型、s表示符号整型、f表示浮点数。
图像深度Java中所对应的数据类型图像深度Java中对应的数据类型
CV_8U=08位byteCV_32S=432位整型-int
CV_8S=18位byteCV_32F=532位-float
CV_16U=216位charCV_64F=664位-double
CV_16S=316位char
                                                                                       图像深度
单通道双通道三通道四通道
CV_8UC1CV_8UC2CV_8UC3CV_8UC4
CV_8SC1CV_8SC2CV_8SC3CV_8SC4
CV_16U C1CV_16U C2CV_16U C3CV_16U C4
CV_16SC1CV_16SC2CV_16SC3CV_16SC4
CV_32SC1CV_32SC2CV_32SC3CV_32SC4
CV_32FC1CV_32FC2CV_32FC3CV_32FC4
CV_64FC1CV_64FC2CV_64FC3CV_64FC4
  • 当使用imread函数时,如果只能使用文件路径参数读入加载一张图像,那么它的默认值时三通道的CV_8UC3,图像深度为CV_8U,其中CV表示计算机视觉、8表示八位、UC表示无符号char、3表示三通道。图像类型与深度之间是有直接的关系的。

Mat 创建与初始化

  • Mat对象中包含了图像各种的基本信息与图像像素数据。总的来说,Mat是由头部与数据部分组成,其中头部还包含一个指向数据的指针。在OpenCV4Android 的接口封装中,因为Java层没有指针对象,因此全部用数组来替代,但是,当我们需要把Mat对象传到Java层的时候,可以通过getNativeObjAddr()方法来实现Mat对象从Java层到C++层指针传递。

  • 创建Mat对象的方法有很多种,其中最常见的有以下几种

    • 通过create 方法实现Mat 对象的创建

      Mat m1 = new Mat()
      m1.create(new Size(3,3),CvType.CV_8UC3);
      Mat m2 = new Mat()
      m2.create(3,3,CvType.CV_8UC3)  
        
      
    • 通过 ones、eye、zeros方法实现初始化创建

      Mat m3 = Mat.eye(3,3,CvType.CV_8UC3);
      Mat m4 = Mat.eye(new Size(3,3),CvType.CV_8UC3);
      Mat m5 = Mat.zeros(new Size(3,3),CvType.CV_8UC3);
      Mat m6 = Mat.ones(new Size(3,3),CvType.CV_8UC3);
      
    • 还可以先定义Mat,然后通过setTo的方法实现 初始化。

      Mat m7 = new Mat(3,3,CvType.CV_8UC3);
      m7.setTo(new Scalar(255,255,255));
      //OpenCV中颜色向量通常用Scalar表示 Scalar(255,255,255)表示白色
      
    • 通过Mat的copyTo()与clone 方法实现对象的创建,Mat中的克隆与拷贝方法会复制一份完全相同数据以创建一个新Mat。

      Mat m8 = new Mat(500,5000,CvType.CV8UC3);
      m8.setTo(new Scalar(255,255,2555));
      Mat camt = image.clone();
      
      //拷贝:
      
      Mat m8 =new Mat(500,500,CvType_CV8UC3);
      m8.setTo(new Scalar(255,255,255));
      Mat result = new Mat();
      m8.copyTo(result);
      

Mat对象保存

  • 创建Mat对象经过一系列操作之后,就可以通过OpenCV4Android的imwrite函数直接将对象保存为图像。

    Mat mat = new Mat(500,500,CvType.CV_8UC3);
    mat.setTo(new Scalar(127,127,127));
    Imgcodecs.imwrite(filePath,mat);
    
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值