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::eye 返回一个恒等指定大小和类型矩阵。 C++: stat...

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

译文参考The OpenCV Reference Manual (Release 2.3)August 17 2011 Mat类 OpenCV c + + n 维稠密数组类 class CV_EXPO...

c++实现简单矩阵类Mat

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

Mat类详解(二)

Mat::~Mat Mat的析构函数。 C++: Mat::~Mat() 析构函数调用Mat::release()。 Mat::operator = 提供矩阵赋值操作。 ...

Kinect for Windows SDK v2.0 开发笔记 (一)环境

嗯,它来了,Windows for Windows v2。 7
  • dustpg
  • dustpg
  • 2014-07-20 05:56
  • 15354

Kinect for Windows SDK v2.0 开发笔记 (二)彩色帧获取

使用SDK: Kinect for Windows SDK v2.0 public preview
  • dustpg
  • dustpg
  • 2014-07-20 07:45
  • 15128

vector的用法

1.vector 的数据的存入和输出: #include #include #include using namespace std; void main() {...

C++类的基本知识总结

最近看了C++ primer plus,学习了类,想写点什么给初学者,也算是一份收获: 首先,C++是OOP,既然这样,就要适合这种思维的编程思考,比如说:用class、方法等等这些。 先说class...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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