openCV学习(一)Mat数据类型

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 );//保存图像文件

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值