OpenCV学习(4) Mat的基本操作(1)
图像在OpenCV中都是通过Mat类来存储的,Mat可以用来表示N维矩阵,当然用的最多的还是二维矩阵。
Mat类有两部分组成:第一部分是头信息,这些信息主要用来描述矩阵,比如矩阵维数ndims,rows,cols(这两个成员变量主要用于二维矩阵,用来表示行数和列数),size,sizes, type,step等等;第二部分是data信息,这是一个指针,指向Mat中存储的数据。
通过下面的代码,我们创建一个二维矩阵,并打印出矩阵:
//创建一个5*5的2维矩阵,数据类型为8bit的无符号数,数据为3个通道,初始值都为(0,0,255)
cv::Mat M(5,5, CV_8UC3, cv::Scalar(0,0,255));
cout << "M = " << endl << " " << M << endl << endl;

这个矩阵的头信息和数据如下图所示:
step表示每一行占据的字节数目,包括padding数据,其中每行中的padding数据有点吓到我了,我们只有15个uchar而已,没想到step竟然这么大,而且每次运行程序还是变化的,真正的数据大小是 M.cols*M.elemSize() = 15,我们可以通过函数M.isContinuous()知道当前矩阵是否有padding数据。
没有padding数据时候,我们可以把矩阵的data当一维数据处理,数据长度就是rows*cols*elemSize()。

下面我看看如何访问矩阵中的元素,并进行操作:
1. 直接访问data,简单快速。
for(i=0; i< M.rows; i++)
{
for(j=0; j<M.cols*M.elemSize(); j++)
{
printf ("%d ", M.data[i*M.cols*M.elemSize() + j]);
}
printf("\n");
}
或者用下面的代码:
uchar* p;
for( i = 0; i < M.rows; ++i)
{
//得到第i行的指针,等价于 p = M.data + i*M.step
p = M.ptr<uchar>(i);
for ( j = 0; j < M.cols; ++j)
{
printf (" %d %d %d",p[j*3], p[j*3+1],p[j*3+2]);
}
printf("\n");
或者我们也可以用at的方式得到数组元素,M.at<cv::Vec3b>(i,j)[2]得到元素中的第2个分量,如果M.at<uchar>(i,j),则只能取到元素的第一个分量。
//用at的方式访问矩阵元素
for(i=0; i< M.rows; i++)
{
for(j=0; j<M.cols; j++)
{
printf ("%d %d %d ", M.at<cv::Vec3b>(i,j)[0],M.at<cv::Vec3b>(i,j)[1], M.at<cv::Vec3b>(i,j)[2]);
}
printf("\n");
}
}
2. 用c++迭代器的方式访问。
cv::MatIterator_<cv::Vec3b> it, end;
for( it = M.begin<cv::Vec3b>(), end = M.end<cv::Vec3b>(); it != end; ++it)
{
printf("%d %d %d\n",(*it)[0], (*it)[1], (*it)[2]);
}
程序源码:工程FirstOpenCV2。
OpenCV学习(4) Mat的基本操作(1)的更多相关文章
- OpenCV学习(5) Mat的基本操作(2)
本章我们学习一下Mat中的常用操作,因为在后面其它的教程中,我们经常要对图像进行各种处理,也要使用这些操作. 一. Mat的复制,就是从一个矩阵A,生成相关的另一个矩阵B. (1)使用赋值 ...
- OpenCV学习:Mat结构中的数据共享机制
使用Mat类,内存管理变得简单,不再像使用IplImage那样需要自己申请和释放内存. Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩 ...
- OpenCV学习笔记——Mat类型数据存储
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number] 比如 CV_8UC3 表示 ...
- OpenCV学习(3)--Mat矩阵的操作
CvMat的矩阵结构 typedef struct CvMat { //矩阵中元素的类型 int type; //行数据长度 int step; /* for internal use only */ ...
- opencv学习笔记(一)IplImage, CvMat, Mat 的关系
opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...
- [OpenCV学习笔记2][Mat数据类型和操作]
[Mat数据类型和基本操作] ®.运行环境:Linux(RedHat+OpenCV3.0) 1.Mat的作用: Mat类用于表示一个多维的单通道或者多通道的稠密数组.能够用来保存实数或复数的向量.矩阵 ...
- OpenCV学习C++接口 Mat像素遍历详解
OpenCV学习C++接口 Mat像素遍历详解
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- opencv学习笔记(五)镜像对称
opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...
随机推荐
- numpy 练习
numpy学习,为后续机器学习铺垫 参考网址 #!/usr/bin/python #coding=utf-8 #__author__='dahu' # from numpy import * impo ...
- Web前端开发最佳实践(4):在页面中添加必要的meta信息
meta标签放置在HTML页面的head中,主要用于标识网站.其中基本上包含了网站的一些描述信息,例如,简介.作者等.这些信息有助于搜索引擎更准确地识别网页的内容,也有助于第三方工具抓取网站基本信息. ...
- 转:C++模板学习
C++ 模板 转:http://www.runoob.com/cplusplus/cpp-templates.html 2018-01-05 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的 ...
- Android之 内容提供器(1)——使用内容提供器访问其它程序共享的数据
(下面内容是阅读郭霖大神的<第一行代码>总结的) 1 概述 内容提供器是Android实现跨程序共享数据的标准方式. 内容提供器的的使用方法有两种, 一是使用已有的内容提供器对其他程序的数 ...
- HDU 6215 Brute Force Sorting(模拟链表 思维)
Brute Force Sorting Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- HTTP 415错误 Unsupported Content-Type
报如下错误: { "badMediaType": { "message": "Unsupported Content-Type", &quo ...
- 2016 湖南省省赛B题《有向无环图》
题目链接[https://vjudge.net/problem/CSU-1804] 题意: 给出一个有向无环图,然后让你算下面的结果,count(i,j)表示i->j之间的路径条数. 题解: 根 ...
- BZOJ1086 SCOI2005王室联邦
想学树上莫队结果做了个树分块. 看完题后想到了菊花图的形状认为无解,结果仔细一瞧省会可以在外省尴尬 对于每一颗子树进行深搜,一旦遇到加在一起大小达到B则将它们并为一省,因为他子树搜完以后没有分出块的大 ...
- 「WC2016」论战捆竹竿
「WC2016」论战捆竹竿 前置知识 参考资料:<论战捆竹竿解题报告-王鉴浩>,<字符串算法选讲-金策>. Border&Period 若前缀 \(pre(s,x)\ ...
- 【BIT套主席树】COGS257-动态排名系统
题意同BZOJ1901,多组数据,数据范围也不一样.重新写一遍复习一下. #include<iostream> #include<cstdio> #include<cst ...