[转]OpenCV—Mat类

 

要熟练使用OpenCV,首先最重要的就是学会Mat数据结构,下面详细介绍一下其应用。
在opencv中Mat被定义为一个类,也可以把它看作一个数据结构,它是以矩阵的形式来存储数据的。这里先介绍一下Mat的基本属性:

 

Mat的常见属性

 

属性说明
datauchar型的指针。Mat类分为了两个部分:矩阵头和指向矩阵数据部分的指针,data就是指向矩阵数据的指针。
dims矩阵的维度,例如5*6矩阵是二维矩阵,则dims=2,三维矩阵dims=3.
rows矩阵的行数
cols矩阵的列数
size矩阵的大小,size(cols,rows)
channels()矩阵元素拥有的通道数,例如常见的彩色图像,每一个像素由RGB
type()表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)如:,CV_8UC3
depth()矩阵中元素的一个通道的数据类型,这个值和type是相关的。例如 type为 CV_8UC3,一个3通道的16位的有符号整数。那么,depth则是CV_8UC
elemSize()矩阵一个元素占用的字节数(不区分通道,即多个通道的总和)
elemSize1()矩阵一个元素每个通道占用的字节数(区分通道,单个个通道的值)
flags一个int型数字,保存了许多有用的信息,flags说明

 

Mat有非常多的创建方法,下面介绍几种常见的方式:

 

1、Mat M
创建一个矩阵头,没有数据。
2、Mat M(2,2,CV_8UC3,Scalar(0,0,1));
2*2大小的矩阵,每个元素为3通道8位无符号整数,如下:
0 0 1 0 0 1
0 0 1 0 0 1
3、Mat M(2,2,CV_8UC1,Scalar(10));
与上面类似:
10 10
10 10
4、Mat M(2,2,CV_8UC1,Scalar::all(0));
数据全为0;
5、Mat M = (Mat_(3,3) << 1,2,3,4,5,6,7,8,9);
初始化赋值
注意问题:Mat可以通过row(),col()函数来访问每一行每一列,Mat结构可以通过clone(),copyTo()函数进行复制,直接赋值的话只会把新Mat的data指向原来Mat的data,而不会重新创建一个数据域;

 

除此之外,Mat还有一些常见的函数用来创建和初始化矩阵:
Mat E = Mat::eye(4,4,CV_64F);
Mat Z = Mat::zeros(4,4,CV_32F);
Mat O = Mat::ones(4,4,CV_8UC1);
分别用来创建一个4*4的单位矩阵,全0矩阵,全1矩阵,类似于Matlab中的矩阵创建。

 

Mat数据的输出

 

在vs中Mat输出数据很方便,直接用cout 就可以数据Mat中的数据了,还包括了一些不同的输出格式。可以通过format(Mat,“ ”)函数来实现,“ ”中不同的值代表不同的输出格式:C,python,csv,numpy,默认的格式与matlab相同。

 

Mat数据的读取和遍历

 

由于Mat主要用来存放图像数据,因此这里不详细说明其数据的遍历方法,具体的方法可以看下一篇OpenCV-图像的基本操作;

 

下面为Mat创建矩阵的相关测试代码:

 

#include<iostream>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;  

int main()
{
    Mat E = Mat::eye(4,4,CV_64F);
    Mat Z = Mat::zeros(4,4,CV_32F);
    Mat O = Mat::ones(4,4,CV_8UC1);
    cout << "E:\n" << E << endl;
    cout << "Z:\n" << Z << endl;
    cout << "O:\n" << O << endl;

    Mat M(2,2,CV_8UC3,Scalar(0,0,1));
    Mat M1(2,2,CV_8UC1,Scalar::all(0));
    Mat M2;
    M2.create(2,2,CV_8UC1);
    Mat M3 = (Mat_<double>(3,3) << 1,2,3,4,5,6,7,8,9);
    Mat M4 = M3.row(1);
    Mat M5(5,5,CV_8UC1,Scalar(10));

    cout << "M:\n" << M << endl;
    cout << "M1:\n" << M1 << endl;
    cout << "M2:\n" << M2 << endl;
    cout << "M3:\n" << M3 << endl;
    cout << "M4:\n" << M4 << endl;
    cout << "M4(Format C):\n" << format(M4,"C") << endl;    //不同形式的输出
    cout << "M5:\n" << M5 << endl;

    waitKey(0);
    return 0;
}
 

 

转自:
http://blog.sina.com.cn/s/blog_6a0e04380100r289.html

 

矩阵数据类型

 

CV_<bit_depth>(S|U|F)C<number_of_channels>

 

S = 符号整型 U = 无符号整型 F = 浮点型

 

例:

 

CV_8UC1 是指一个8位无符号整型单通道矩阵,

 

CV_32FC2是指一个32位浮点型双通道矩阵

 

CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1
CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2
CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3
CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4
CV_32SC1 CV_32FC1 CV_64FC1
CV_32SC2 CV_32FC2 CV_64FC2
CV_32SC3 CV_32FC3 CV_64FC3
CV_32SC4 CV_32FC4 CV_64FC4

 

其中,通道表示每个点能存放多少个数,类似于RGB彩色图中的每个像素点有三个值,即三通道的。

 

图片中的深度表示每个值由多少位来存储,是一个精度问题,一般图片是8bit(位)的,那么深度是8。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值