图像在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)的更多相关文章

  1. OpenCV学习(5) Mat的基本操作(2)

          本章我们学习一下Mat中的常用操作,因为在后面其它的教程中,我们经常要对图像进行各种处理,也要使用这些操作. 一. Mat的复制,就是从一个矩阵A,生成相关的另一个矩阵B. (1)使用赋值 ...

  2. OpenCV学习:Mat结构中的数据共享机制

    使用Mat类,内存管理变得简单,不再像使用IplImage那样需要自己申请和释放内存. Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩 ...

  3. OpenCV学习笔记——Mat类型数据存储

    CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number] 比如 CV_8UC3 表示 ...

  4. OpenCV学习(3)--Mat矩阵的操作

    CvMat的矩阵结构 typedef struct CvMat { //矩阵中元素的类型 int type; //行数据长度 int step; /* for internal use only */ ...

  5. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  6. [OpenCV学习笔记2][Mat数据类型和操作]

    [Mat数据类型和基本操作] ®.运行环境:Linux(RedHat+OpenCV3.0) 1.Mat的作用: Mat类用于表示一个多维的单通道或者多通道的稠密数组.能够用来保存实数或复数的向量.矩阵 ...

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

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

  8. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  9. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

随机推荐

  1. python脚本传入参数--精讲(getopt模块)

    1.最常用的sys.argv[],这个不多谈 2.形如 dahu@dahu-OptiPlex-:~/json_folder$ python sub1.py -abb -oaaa --output=ou ...

  2. python快速教程-vamei

    2016年10月26日 12:00:53 今天开始着手python的学习,希望能高效快速的学完! Python基础(上)... 7 实验简介... 7 一.实验说明... 8 1. 环境登录... 8 ...

  3. 用Redis Desktop Manager连接Redis(CentOS)

    Redis Desktop Manager是Redis图形化管理工具,方便管理人员更方便直观地管理Redis数据. 然而在使用Redis Desktop Manager之前,有几个要素需要注意: 一. ...

  4. phpstorm使用和配置技巧

    1. 使用phpstorm的过程中,有时光标不小心变成了方块状,怎么修复回来呢? 见下图,去掉“Use block caret” 前面的对勾即可. 2.多项目并存的问题 PhpStorm或 WebSt ...

  5. learn_requests

    # -*- coding: utf-8 -*- import requests URL_IP = 'http://localhost:8000/ip' URL_GET = 'http://localh ...

  6. JSP内置对象——request对象

    request对象request对象封装了由客户端生成的HTTP请求的所有细节,主要包括HTTP头信息.系统信息.请求方式和请求参数等. 通过request对象提供的各种方法可以处理客户端浏览器提交的 ...

  7. kotlin 类 接口 抽象类 子类类型有限的class 。sealed class

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 用 private 封装,可以防止别人修改. 就好像 内有高压,危险,不让碰.

  8. POJ 3553 Light Switching Game 博弈论 nim积 sg函数

    http://poj.org/problem?id=3533 变成三维的nim积..前面hdu那个算二维nim积的题的函数都不用改,多nim积一次就过了...longlong似乎不必要但是还是加上了 ...

  9. 【推导】【贪心】【高精度】Gym - 101194E - Bet

    题意:每个队伍有个赔率pi,如果你往他身上押x元,它赢了,那么你得到x+(1/pi)x元,否则你一分都得不到.问你最多选几支队伍去押,使得存在一种押的方案,不论你押的那几支队伍谁赢,你都能赚得到钱. ...

  10. 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树

    这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...