欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

openCV学习(一)Mat数据类型

程序员文章站 2022-05-16 11:23:19
...

Mat数据结构

Mat类型是opencv2.0后的类型,使用此类型无需进行内存管理,即无需手动分配内存,在不需要时自动释放内存,但因目前的许多嵌入式系统仅支持c语言,故而除了在某些嵌入式系统中使用cvMat或IplImage, 基本使用Mat类型。

注:后续的matrix均表示存储图像像素值的矩阵 。

Mat包含2个数据部分:the matrix header--包含matrix大小,存储方法,matrix存储地址等,matrix header内存大小固定;

                                  指向像素matrix的指针。

OpenCV使用的是引用计数系统:每个Mat对象都有着自己的header,但matrix可在两个实例中通过指向同一个matrix首地址的指针来共享数据。拷贝构造和赋值均只拷贝其header和指向matrix的指针,而非像素数据的本身。当拷贝一个Mat对象的header时,关于matrix的计数器数值增加,一旦header被清理了,counter减少,当counter减少到0的时候,matrix的内存空间会被释放。

可创建关于全部数据的子部分的header。例如,可通过创建一个有着新边界的header来创建ROI(感兴趣区域)。对应代码如下:

Mat D (A, Rect(10, 10, 100, 100) ); //using a rectangle
Mat E = A(Range::all(), Range(1,3)); //using row and column boundaries

OpenCV提供了clone()和copyto()两函数来拷贝matrix数据本身,示例如下:

Mat F = A.clone();
Mat G;
A.copyTo(G);

像上述示例,修改F或G不会影响A中header所指matrix。

存储方法:颜色空间,数据类型。

颜色空间:RGB,HSV,HLS,YCrCb(JPEG格式图片常用),CIE。每一种颜色空间的成分都有其有效范围,从而决定了村塾的数据类型。

显示创建Mat对象

Mat类型不仅可以存储图像,还可以通过构造函数创建一个Mat对象。如:

   Mat M(2,2, CV_8UC3, Scalar(0,0,255));
    cout << "M = " << endl << " " << M << endl << endl;

<<操作符可以输出Mat里的真实数据值,但仅限于二维矩阵。

构造函数的参数含义:行大小,列大小,数据类型及每个矩阵元素的通道数(具体形式

CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]

),数据。

已经存在的IplImage类型转换成Mat类型:

IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // convert IplImage* -> Mat

加载,转换颜色空间,保存图像文件

 Mat image;
 image = imread( imageName, 1 );//读取图像文件
Mat gray_image;
 cvtColor( image, gray_image, COLOR_BGR2GRAY );//转换颜色空间
imwrite( "../../images/Gray_Image.jpg", gray_image );//保存图像文件