1 概述
Mat类是OpenCV表达二维图片的基础。
经过简单阅读有关Mat的documentation,记录其中提出的几个关键要点。
- OpenCV 的API函数,对图像的输出参数都会自动管理内存,调用者可不必亲自管理。但是如果调用者已经对输出参数配置好了合适大小的内纯,API会自动福永该内存而不是重新申请。
- 在使用OpenCV提供的API时,大部分时间不需要考虑内存管理。
- Mat的 = 运算符重载和拷贝构造函数,都不会复制Mat的数据区。若想获得数据区的副本,则需要使用 Mat::clone()和Mat::copyTo()函数。
OpenCV使用BGR格式存储三原色。
对于二维的Mat,可以使用 << 操作符将矩阵内容显示在屏幕上(插入流)。
Mat的数据格式使用预定义的类似CV_8UC3一样的宏。其中8U代表8bit的无符号整数,C3代表每个pixel有三个通道,8UC3即表示每个pixcel共需要24 bit,3 byte的数据进行存储。注意,在C++代码中,若没有申明using namespace cv; 那么在使用CV_8UC3一类的宏时,不能在前面加 cv:: 作用域修饰,这会导致预编译器在做宏展开时报错。
创建一个Mat可以使用如下形式的语句。
cv::Mat M(2,2, cv::CV_8UC3, cv::Scalar(0,0,255));
其中cv::Scalar是一个4元标量,这里仅使用了其前3个元素。
OpenCV提供类似于MATLAB的eye(), ones(), zeros()函数,但需要指定数据格式。
Mat的 << 操作符支持使用不同的格式输出,输出的格式涵盖python默认,numpy和c语言的格式。
经过学习Mat的一些特性,了解到Mat实际是为了处理图像而设计的一种矩阵表示方法,是图像表示成了矩阵,而不是用矩阵表示图像。这里我们不能假定Mat的所有特性与一般意义下的矩阵是一致的,这充分体现在Mat的数据格式和Mat的算术运算上。
2 获取单个数据
像std::vector那样提供了at()函数,但at()是一个模板函数,需要在使用是制定数据类型。
3 算数运算
对于一个提供矩阵表达和运算的库,应该测试一下某些关键函数的行为。这里测试了转置函数,加法,减法,数乘和矩阵乘法,确实发现了一些OpenCV的特性。
3.1 转置
与预想基本一致,Mat的转置函数t(), 返回一个MatExpr类型的对象,可以参与其他算数运算或者赋值给另外一个