2.1图像表示类Mat

OpenCV Mat类

  无论什么数字图像处理,最基本的操作对象是图像的基本元素,即像素。Mat类是OpenCV中基础图像容器类。从根本上来说,一张图像是一个由数值组成的矩阵。这也是OpenCV2用cv::Mat这个数据结构来表示图像的原因。矩阵的每一个元素代表一个像素。对于灰度图像(仅包含“灰色”的图像)而言,像素由8位无符号数来表示,其中0代表黑色,255代表白色。对于彩色图像而言,每个像素需要三个这样的8位无符号来表示三个颜色通道(RGB-红、绿、蓝)。因此,在这种情况下矩阵的元素是一个三元数。
Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但是矩阵本身的尺寸会依图像的不同而不同。矩阵由宽度(width)、高度(height)、类型(tpye),行数据长度(step)和一个指向数据的指针构成。

创建Mat对象

  Mat不但是一个非常有用的图像容器类,同时而是一个通用的矩阵类。创建一个Mat对象有很多种方法。下面是使用Mat的构造函数,

Mat m(2, 2 , CV_8UC3, Scalar(0, 0, 255));
std::cout<<"m = "<<std::endl<<m<<std::endl;

这里写图片描述
  对于二维多通道图像,首先要定义其尺寸,即行数和列数。然后需要指定存储元素的数据类型以及每个矩阵点的通道数。定义规则:

CV_[维数][带符号与否][类型前缀]C[通道数]。另外,Scalar是个short类型的向量。

比如CV_8UC3表示使用8位的unsigned char类型,每个像素由三个元素组成三通道。
  Mat类实现了引用计数以及浅拷贝,当图像之间进行幅值时,图像数据并没有发生复制,两个对象都指向同一块内存块。这也可用于参数传值的图像,以及返回值传值的图像。引用计数的作用是当且仅当所有引用内存数据的对象都被析构后,才会释放内存块。如果你希望创建的图像拥有原始图像的崭新拷贝,那么可以使用copyTo()方法或clone()。

Mat和IplImage

   OpenCV 2引入了崭新的C++接口。之前使用的C函数和数据库任何可以使用,其中图像是通过IplImage进行操作,该类继承自IPL库,即英特尔图像处理库(Intel Image Processing Library),现在已整合进IPP库即英特尔综合性能库(Intel Integrated Performance Primitive Library)。如果你使用老式的C风格接口,那么你需要操作IplImage结构。幸运的是,可以方便地转换一个IplImage到cv::Mat对象。

IplImage* iplImage = cvLoadImage(“C:\\img.jpg”);
cv::Mat image(iplImage, false);

   cvLoadImage是一个C风格的图像读取函数。cv::Mat对象构造函数中的第二个参数说明不需要进行数据拷贝(设true意味着得到崭新的拷贝,默认值为false)。我们应该尽量避免使用这个被废弃的数据结构,而是使用cv::Mat。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值