• 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;

    image

     

          这个矩阵的头信息和数据如下图所示:

          step表示每一行占据的字节数目,包括padding数据,其中每行中的padding数据有点吓到我了,我们只有15个uchar而已,没想到step竟然这么大,而且每次运行程序还是变化的,真正的数据大小是 M.cols*M.elemSize() = 15,我们可以通过函数M.isContinuous()知道当前矩阵是否有padding数据。

         没有padding数据时候,我们可以把矩阵的data当一维数据处理,数据长度就是rows*cols*elemSize()。

    image

    下面我看看如何访问矩阵中的元素,并进行操作:

    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(" ");

    }

    或者用下面的代码:

    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(" ");

        或者我们也可以用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(" ");
        }

    }

    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 ",(*it)[0], (*it)[1], (*it)[2]);

    }

    程序源码:工程FirstOpenCV2。

     

  • 相关阅读:
    linux编译C
    Windows下ARP协议的工作原理简介
    窥探QQ基础数据库架构演变史
    JAVA培训—线程同步--卖票问题
    SQLite、MySQL和PostgreSQL 三种关系数据库哪个好?
    再论谭浩强《C语言程序设计》
    JPG加入RAR文件原理详解
    如何区分一个程序员是“老手“还是“新手“?
    AutoITx3.DLL所有函数及说明
    windows索引服务
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/3320284.html
Copyright © 2020-2023  润新知