OpenCV杂记 - Mat in C++

本文介绍了OpenCV的Mat类,包括Mat的内存管理、数据格式、算术运算等特性。详细讨论了Mat的转置、加法、数乘以及矩阵乘法,强调了在不同数据类型和操作中的注意事项,特别提到了数据截断和格式转换的功能。
摘要由CSDN通过智能技术生成

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类型的对象,可以参与其他算数运算或者赋值给另外一个

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值