OpenCV官方教程学习----Core moudle----Mat

Core moudle(基础模块)

Mat - The Basic Image Container

1.1 Mat

首先当然是学习数据结构啦,OpenCV的最最最基本的数据结构Mat

Mat基本上包含两个部分:

  1. the matrix header : 包含矩阵的大小、存储方式、存储地址等信息。
  2. a pointer to the matrix containing the pixel values:指向矩阵元素的指针。

图像计算中往往计算量很大,因此OpenCV中赋值运算符只会复制矩阵的头和指向矩阵元素的指针,而不是数据本身。

Mat A, C;                          // 只是创建了矩阵头部分
A = imread(argv[1], IMREAD_COLOR); // 实际分配数据
Mat B(A);                                 // 使用构造函数复制
C = A;                                    // 赋值操作
//A,B,C表示同一个区域的数据矩阵,他们其中一个修改将影响其他对象。

由此可见,OpenCV中数据矩阵一般是共享的,改变的只是矩阵头

也正是因为这个原因,OpenCV允许我们给数据矩阵的部分内容创建矩阵头。

Mat D (A, Rect(10, 10, 100, 100) ); //方形的部分矩阵
Mat E = A(Range::all(), Range(1,3)); //按行列来取部分矩阵

对于一个数据矩阵,可以产生很多个Mat对象,OpenCV自己通过计数来维护他们,当一个对象消亡时,计数器减一,当增加对象时,计数器加一,当计数器为0时,矩阵数据被释放。

为此,OpenCV提供了两个拷贝函数,cv::Mat::clone()cv::Mat::copyTo()他们会开辟新的区域存储矩阵数据。

Mat F = A.clone();		
Mat G;
A.copyTo(G);
//A,F,G相互不会影响

注意:

  1. OpenCV函数的输出图像是自动分配的。
  2. OpenCV自动管理内存分配释放,用户不用关心。
  3. 赋值和拷贝构造函数只是复制矩阵头,并没有复制实际数据矩阵
  4. cv::Mat::clone()cv::Mat::copyTo()可以开辟新的区域来复制数据矩阵。

1.2 Storing methods(存储方式)

在OpenCV中可以选择使用的颜色空间和存储数据的类型。

颜色空间:

  1. RGB是最常用的,在OpenCV中是用BGR来表示的。
  2. HSV,HLS将颜色分为色调、饱和度、亮度.
  3. JPEG
  4. CIE La * b.

数据类型:有符号无符号,一个字节还是多个字节等等。

1.3 Creating a Mat object explicitly(显示构建Mat)

在OpenCV中以使用<<操作符来对二维矩阵进行操作,仅限二维矩阵。

  1. cv::Mat::Mat构造函数,可以设置行列、存储方式、所有元素初值。

    Mat M(2,2, CV_8UC3, Scalar(0,0,255));
    //2X2的矩阵
    //存储方式:8位无符号,三通道。
    //所有元素初始是0,0,255
    

    存储方式解析:

    CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
    CV_[每项的位数][有符号或无符号][类型前缀]C[通道编号]
    
  2. cv::Mat::create函数。

    Mat M;
    M.create(4,4, CV_8UC(2));
    //创建4X4矩阵,每个元素两个通道。
    
  3. 生成特定矩阵

    Mat E = Mat::eye(4, 4, CV_64F );	//单位矩阵
    Mat O = Mat::ones(2, 2, CV_32F );	//全1矩阵
    Mat Z = Mat::zeros(3,3, CV_8UC1 );	//全零矩阵。
    
  4. 对于小矩阵,可以使用流操作符<<直接输入。

    Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//行优先排列
    
  5. cv::randu()产生随机矩阵

    Mat R = Mat(3, 2, CV_8UC3);
    randu(R, Scalar::all(0), Scalar::all(255));
    //随机生成0-255的矩阵,矩阵是3x2的,矩阵R存储值改变
    

将矩阵按照某种形式显示:使用format来实现

Mat R = (Mat_<double>(3,3) << 1,2,3,4,5,6,7,8,9);
cout << "R (default) = " << endl << R << endl << endl;
cout << "R (python) = " << endl << format(R, Formatter::FMT_PYTHON) << endl << endl;
cout << "R (csv) = " << endl << format(R, Formatter::FMT_CSV ) << endl << endl;
cout << "R (numpy) = " << endl << format(R, Formatter::FMT_NUMPY ) << endl << endl;
cout << "R (c) = " << endl << format(R, Formatter::FMT_C ) << endl << endl;

在这里插入图片描述

OpenCV也可以用流操作符<<对其他数据类型进行操作。

//二维点
Point2f P(5, 1);
cout << "Point (2D) = " << P << endl << endl;

//三维点
Point3f P3f(2, 6, 7);
cout << "Point (3D) = " << P3f << endl << endl;

//通过Mat输出C++容器
vector<float> v;
v.push_back( (float)CV_PI);   v.push_back(2);    v.push_back(3.01f);
cout << "Vector of floats via Mat = " << Mat(v) << endl << endl;

//输出二维点组成的容器
vector<Point2f> vPoints(20);
for (size_t i = 0; i < vPoints.size(); ++i)
    vPoints[i] = Point2f((float)(i * 5), (float)(i % 7));
cout << "A vector of 2D Points = " << vPoints << endl << endl;

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值