opencv mat

1、Mat是OpenCV最基本的数据结构,Mat即矩阵(Matrix)的缩写,Mat数据结构主要包含2部分:Header和Pointer。Header中主要包含矩阵的大小,存储方式,存储地址等信息;Pointer中存储指向像素值的指针。
2、IplImage*是C语言操作OpenCV的数据结构,在当时C操纵OpenCV的时候,地位等同于Mat,OpenCV为其提供了一个接口,很方便的直接将IplImage转化为Mat,即使用构造函数

Mat(const IplImage* img, bool copyData=false);

3、关于Mat数据复制:前面说过Mat包括头和数据指针,当使用Mat的构造函数初始化的时候,会将头和数据指针复制(注意:只是指针复制,指针指向的地址不会复制),若要将数据也复制,则必须使用copyTo或clone函数
opencv mat_第1张图片
4、Mat存储
Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放类型;如果是RGB彩色图,存放类型。
单通道灰度图数据存放格式:
opencv mat_第2张图片
多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图:
opencv mat_第3张图片
注意通道的顺序反转了:BGR。通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便。可以用 isContinuous()函数来判断图像数组是否为连续的。
5、访问图像中的像素
以Mat example为例,单通道,字符型

    for (int i = 0; i for (int j = 0; j < example.cols;j++)
        {
           example.ptr<uchar>(i)[j]//访问第i行j列的元素           
        }
    }

三通道
对于Mat的访问有两种方式
第一种,利用Mat::at进行访问

//读取3通道彩色图像
Mat img = imread("xx");
int px;
//读取图像中第一行第一列,Blue通道数据
int px = img.at(0, 0)[0];

第二种,利用Mat的成员ptr指针进行访问

//读取3通道彩色图像
Mat img = imread("xx");
//将Mat中的第一行地址赋予pxVec
uchar* pxVec=img.ptr<uchar>(0);
//遍历访问Mat中各个像素值
int i, j;
int px;
for (i = 0; i < img.rows; i++)
{
    pxvec = img.ptr<uchar>(i);
    //三通道数据都在第一行依次排列,按照BGR顺序
    for (j = 0; j < img.cols*img.channels(); j++)
    {
        px=pxvec[j];
    }
}

6、赋值
不能用Mat::at进行赋值,只能用ptr对Mat中的像素点进行赋值
7、Mat与IplImage 转换
Mat 转 IplImage

Ipl8bit = IplImage(MatImage8bit);
Ipl8bit .imageData = reinterpret_cast<char*>(MatImage8bit.data);

IplImage 转 Mat

MatImage8bit = Mat(&Ipl8bit);

你可能感兴趣的:(opencv,opencv,mat)