OpenCV03_Mat对象

Mat对象

  • 一张图,在计算机中是二维数组的形式存放的,把这个数组存放在Mat对象里面,是一个数据结构
  • Mat对象与IplImage对象
    • Mat对象是OpenCV2.0之后引进的数据结构,自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。
      • 分为两个部分,头部与数据部分
    • IplImage是从2001年OpenCV发布之后就一直存在的,是C语言风格的数据结构,需要开发人员自己分配与管理内存,对大的程序使用它容易导致内存泄漏的问题

Mat对象的构造函数与常用方法

  • 构造函数:
    • Mat()
    • Mat(int rows,int cols,int type)
    • Mat(Size size,int type)
    • Mat(int rows,int cols,int type,const Scalar &s)
    • Mat(Size size,int type,const Scalar &s)
    • Mat(int ndims,const int *sizes,int type)
    • Mat(int ndims,const int *sizes,int type,const Scalar &s)
  • 常用方法:
    • void copyTo(Mat mat)
      • 完成复制一份
    • void convertTo(Mat dst,int type)
    • Mat clone()
      • 完成复制一份
    • int channels()
    • int depth()
      • 深度
    • bool empty();
      • 是否为空
    • uchar* ptr(i=0)
      • 获取按行的指针,i=0表示第0行

构造:

    Mat dst;
    dst = Mat(src.size(), src.type());  //定义大小,类型
    dst = Scalar(127, 0, 255);
    namedWindow("output", CV_WINDOW_AUTOSIZE);
    imshow("output", dst);

生成一张什么都没有的图像,颜色是RGB(127, 0, 255),大小、类型与原图像相同
这里写图片描述

完全拷贝:
1,克隆clone()
Mat dst = src.clone();
2,copyTo()
Mat dst;
//需要传一个参数
src.copyTo(dst);

这里写图片描述

通道数channels()
cvtColor(src, dst, CV_BGR2GRAY); //转换为灰度图
printf("input image channels: %d\n", src.channels()); //看看有多少个通道
printf("output image channels: %d\n", dst.channels());

这里写图片描述

取地址uchar* ptr(i=0)
//取第一个相素值的位置
const uchar* firstRow = dst.ptr<uchar>(0);
printf("first pixel value: %d", *firstRow);

得到全部的行/列
int cols = dst.cols;
int rows = dst.rows;

Mat对象的使用

  • 部分复制:
    • 一般情况下只会复制对象的头和指针部分,不会复制数据部分
    • Mat A = imread(imgFilePath);
    • Mat b(A)//只部分复制
  • 完全复制:
    • 如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现
      • Mat F = A.clone();
      • Mat G
        A.copyTo(G)
  • Mat对象使用的四个要点
    • 输出图像的内存是自动分配的
    • 使用OpenCV的C++接口,不需要考虑内存分配问题
    • 赋值操作和拷贝操作只会复制头部分
    • 使用clone与copyTo两个函数才能实现完全复制

Mat对象的创建

  • cv::Mat::Mat构造函数
    • Mat M(2,2,CV_8UC3,Scalar(0,0,255))
      • 前两个参数分别表示行(row)和列(column)
      • 第三个CV_8UC3中的8表示每个通道占8位,U表示无符号,C表示Char类型,3表示通道数目为3
      • 第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致
  • 创建多维数组
    • int sz[3] = {2,2,2};
    • Mat L(3,sz,CV_8UC1,Scar::all(0));
  • cv::Mat::creat实现
    • Mat M;
      M.creat(4,3,CV_8UC2);
      M = Scalar(127,127);
  • 定义小数组
    • Mat kernel = (Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
    • filter2D(src, dst, -1, kernel);
  • 小技巧
    • zeros,全0
    • eye,对角线变成1,其它地方变成0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值