参考:https://blog.csdn.net/qq_34963853/article/details/79746166Mat数据结构 Mat类型是opencv2.0后的类型,使用此类型无需进行内存管理,即无需手动分配内存,在不需要时自动释放内存,但因目前的许多嵌入式系统仅支持c语言,故而除了在某些嵌入式系统中使用cvMat或IplImage, 基本使用Mat类型。 注:后续的matrix均表示存储图像像素值的矩阵 。 Mat包含2个数据部分:(1)the matrix header--包含matrix大小,存储方法,存储地址等,header内存大小固定; (2)指向像素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。 显示创建Mat对象: Mat类型不仅可以存储图像,还可以通过构造函数创建一个Mat对象。如: Mat M(2,2, CV_8UC3, Scalar(0,0,255)); 构造函数的参数含义:行大小,列大小,数据类型及每个矩阵元素的通道数(具体形式CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number] ),数据(3通道时默认为B,G,R数值,如果想设置其他颜色空间可以通过cvtColor()转换)。 已经存在的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 );//保存图像文件
原文地址:https://www.cnblogs.com/zhibei/p/12273398.html
时间: 2024-11-08 23:51:31