opencv C++ Mat类的基本知识(混

转载 2016年11月09日 17:22:50

data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (uchar* data)


dims:Mat所代表的矩阵的维度,如 3 * 4 的矩阵为 2 维, 3 * 4 * 5 的为3维


channels:通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12 个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。


depth:深度,即每一个像素的位数(bits),在opencv的Mat.depth()中得到的是一个 0 – 6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位;


step:是一个数组,定义了矩阵的布局,具体见下面图片分析,另外注意 step1 (step / elemSize1),M.step[m-1] 总是等于 elemSize,M.step1(m-1)总是等于 channels;


elemSize : 矩阵中每一个元素的数据大小,如果Mat中的数据的数据类型是 CV_8U 那么 elemSize = 1,CV_8UC3 那么 elemSize = 3,CV_16UC2 那么 elemSize = 4;记住另外有个 elemSize1 表示的是矩阵中数据类型的大小,即 elemSize / channels 的大小


这是一个二维矩阵,那么维度为 2 (M.dims == 2);
M.rows == 3; M.cols == 4;
sizeof(uchar) = 1,那么每一个数据元素大小为 1 (M.elemSize() == 1, M.elemSize1() == 1);
CV_8U 得到 M.depth() == 0, M.channels() == 1;
因为是二维矩阵,那么 step 数组只有两个值, step[0] 和 step[1] 分别代表一行的数据大小和一个元素的数据大小,则 M.step[0] == 4, M.step[1] == 1;
M.step1(0) == M.cols = 4; M.step1(1) == 1;


假设上面的矩阵数据类型是 CV_8UC3,也就是三通道

M.dims == 2; M.channels() == 3;M.depth() == 0;
M.elemSize() == 3 (每一个元素包含3个uchar值) M.elemSize1() == 1 (elemSize / channels)
M.step[0] == M.cols * M.elemSize() == 12, M.step[1] == M.channels() * M.elemSize1() == M.elemSize() == 3;
M.step(0) == M.cols * M.channels() == 12 ; M.step(1) == M.channels() == 3;


Mat::clone()  创建一个全拷贝

Mat::copyTo();  不止表示拷贝数据,还表示n=m.col(0)

Mat矩阵中数据指针Mat.data是uchar类型指针,CV_8U系列可以通过计算指针位置快速地定位矩阵中的任意元素。

Mat M(7,7,CV_32F,Scalar(1,3));

解释如下:创建一个M矩阵,7行7列,类型为CV_32F,C2表示有2个通道。Scalar(1,3)是对矩阵进行初始化赋值。第一个通道全为1,第2个通道全为3。

Mat_<uchar>对应的是CV_8U,

Mat_<char>对应的是CV_8S,

Mat_<int>对应的是CV_32S,

Mat_<float>对应的是CV_32F,

Mat_<double>对应的是CV_64F


 cv::Mat是一个n维矩阵类,声明在<opencv2/core/core.hpp>中。(using namespace cv)

 cv::Mat_是一个模板类,声明在<opencv2/core/core.hpp>中。

 由于cv::Mat类中含有很多模板方法,这些参数类型要到运行期才能确定,但是这种灵活性却使得简单的调用代码复杂,因此就有了cv::Mat_类来简化代码。

cv::Mat image = cv::imread('img.jpg');
image.at<uchar>(j, i) = 255;

cv::Mat_<uchar> im2 = image;
im2(j, i) = 255;

Mat有3个重要的方法:

         1、Mat mat = imread(const String* filename);        读取图像

         2、imshow(const string frameName, InputArray mat);     显示图像

         3、imwrite (const string& filename, InputArray img);   储存图像

at<>和ptr<>的区分

image.at<uchar>(i,j):取出灰度图像中i行j列的点。

image.at<Vec3b>(i,j)[k]:取出彩色图像中i行j列第k通道的颜色点。其中uchar,Vec3b都是图像像素值的类型,Vec3b通过typedef Vec<T,N>来定义的,N代表元素的个数,T代表类型。

更简单一些的方法:OpenCV定义了一个Mat的模板子类为Mat_,它重载了operator()让我们可以更方便的取图像上的点。

Mat_<uchar> im=image;

im(i,j)=255;

取出图像中第i行数据的指针:image.ptr<uchar>(i);’

opencv遍历的详细介绍:http://www.cnblogs.com/ronny/p/3482202.html

http://www.cnblogs.com/zjgtan/archive/2013/04/06/3002962.html

OpenCV参考手册之Mat类详解(一)

译文参考The OpenCV Reference Manual (Release 2.3)August 17 2011 Mat类 OpenCV c + + n 维稠密数组类 class CV_EXPO...
  • giantchen547792075
  • giantchen547792075
  • 2011年12月11日 16:42
  • 112680

c++实现简单矩阵类Mat

刚学习C++,之前把 Primer 看了一遍,现在也在刷 leetcode,感觉学习编程语言光看书页刷题也是不够的,最好是能做一些实际的项目,这样要用到哪些东西时不明白再看书,就会印象深刻些,否则光看...
  • yc461515457
  • yc461515457
  • 2016年04月24日 14:19
  • 4968

OpenCV中矩阵类详解之一:Mat

Mat::eye 返回一个恒等指定大小和类型矩阵。 C++: static MatExpr Mat::eye(int rows, int cols, inttype) C++: static MatE...
  • u012564690
  • u012564690
  • 2014年01月02日 09:34
  • 21635

OpenCV中Mat的C++用法介绍

Mat       OpenCV 自 2001 年出现以来。在那些日子里库是围绕C接口构建的。在那些日子里,他们使用名为IplImage C 的结构在内存中存储图像。这是您将在大多数较旧的教程和...
  • wadefan7
  • wadefan7
  • 2015年03月05日 15:53
  • 4265

C++读写.mat文件

最近在编写C++程序的过程中,需要使用matlab生成的.mat文件,于是查找了基本使用方法。 我的计算机环境是win7 64位系统,VS2010,matlab R2010b。 一、工程配...
  • lien0906
  • lien0906
  • 2015年01月20日 18:55
  • 741

OpenCV学习C++接口 Mat像素遍历详解

IplImage 学习总结:
  • chenxun2009
  • chenxun2009
  • 2014年08月06日 20:29
  • 4392

【VS开发】C++ opencv Mat基础

OpenCV2:Mat 1.Mat基础 在计算机内存中,数字图像是已矩阵的形式保存的。OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像...
  • LG1259156776
  • LG1259156776
  • 2016年04月27日 13:03
  • 1083

使用C++语言读取*.mat文件中的数据

借助于Matlab的接口函数,在Visual Studio中使用C++语言读取*.mat文件中的数据(这里主要是2维矩阵(灰度图像)和3维矩阵(彩色图像))到OpenCV中的Mat数据结构中并显示图像...
  • Destiny0321
  • Destiny0321
  • 2017年01月06日 15:24
  • 2590

OpenCV从Mat中提取某些行或列

Mat的rowRange和colRange可以获取某些范围内行或列的指针: Mat::rowRange Creates a matrix header for the specif...
  • lichengyu
  • lichengyu
  • 2014年03月17日 20:53
  • 24332

C++类的基本知识实例

  • 2013年05月25日 12:32
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opencv C++ Mat类的基本知识(混
举报原因:
原因补充:

(最多只允许输入30个字)