OPenCV 的mat类

一、

2001年以来,OPenCV的函数库是基于C接口构建的,因此在最初的几个版本的OpenCV中,一般使用名为IplImage的C语言结构体在内存中存储图像。而C++带来了类的概念。OpenCV2在2.0版本中引入了一个新的C++接口,利用自动内存管理,不需要再纠结于内存管理的问题。使用Mat类数据结构作为主打后,OpenCV变得越来越像Matlab那样,上手方便。有些函数名称都和matlab一样,如imread、imshow、imwrite等。


关于Mat类,首先要知道的是:

(1)不必再手动为其开辟空间。

(2)不必再在不需要时立即将空间释放。


Mat是一个类,有两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值矩阵的指针(根据所选存储方法不同,矩阵可以是不同的维数)。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。因此,当在程序中传递图像并创建副本时,大的开销是由矩阵造成的,而不是信息头。OpenCV 是一个图像处理库,囊括了大量的图像处理函数。尽量不要进行大图像的复制,否则会降低程序运行速度。


为了解决此问题,OpenCV使用了引数机制。让每个Mat对象都有自己的信息头,但共享一个矩阵。通过让矩阵指针指向同一地址实现。拷贝构造函数只负责复制信息头和矩阵指针,而不复制矩阵。


eg.  

Mat A,C;

A=imread("1.jpg",CV_LOAD_IMAGE_COLOR);       //为矩阵开辟内存

Mat B(A); //使用拷贝构造函数

C=A; //使用赋值运算符

以上的Mat对象都指向同一个也是唯一一个数据矩阵。虽然信息头不同,但通过任何一个信息头所做出的改变也会影响其他对象。即在程序中从上到下对图像进行处理,Mat对象指向的都是同一个矩阵。


二、显示创建Mat对象的七种方法

Mat不但是一个非常有用的图像容器类,同时也是个通用的矩阵类,可以创建和操作多维矩阵。

1.使用Mat构造函数

Mat  M(2,2,CV_8UC3,Scalar(0,0,255));   //8位的unsigned cahr型,每个像素由三个元素组成三通道(预先定义的通道数可以多达四个)。

cout<<"M = "<<M<<endl;

首先定义其尺寸,即行数和列数。然后,指定存储元素的数据类型以及每个矩阵点的通道数:

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

即CV_[位数][带符号与否][类型前缀]C[通道数]

Scalar是short类型的向量,能使用指定的定制化值来初始化矩阵,也可以用于表示颜色。


2.创建超过两维的矩阵(C/C++)

int sz={2,2,2};  // 
Mat L(3,sz,CV_8UC,Scalar::all(0));
指定维数,然后传递一个指向一个数组的指针,这个数组包含每个维度的尺寸。



载入图片:

IplImage* IPL_img = cvLoadImage("02.jpg", -1);     //导入图片

IplImage* gray = cvCreateImage(cvGetSize(IPL_img), IPL_img->depth, 1);    // 创建与导入图片大小相同的空白图片,1是灰度图的通道数。


将iplImg*格式的图像转换为mat :  cv::Mat m = cv::cvarrToMat(gray);   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值