1. 构造

  • 无参数构造方法
Mat::Mat()
  • 创建行数为 rows,列数为 col,类型为 type 的图像
Mat::Mat(int rows, int cols, int type)
  • 创建大小为 size,类型为 type 的图像
Mat::Mat(Size size, int type)
  • 创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始化为值 s
Mat::Mat(int rows, int cols, int type, const Scalar& s)
  • 创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s
Mat::Mat(Size size, int type, const Scalar& s)
  • 将m赋值给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据,属于浅拷贝
Mat::Mat(const Mat& m)
  • 创建行数为rows,列数为col,类型为type的图像,此构造函数不创建图像数据所需内存,而是直接使用data所指内存,图像的行步长由 step指定
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
  • 创建大小为size,类型为type的图像,此构造函数不创建图像数据所需内存,而是直接使用data所指内存,图像的行步长由step指定
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
  • 创建的新图像为m的一部分,具体的范围由rowRange和colRange指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据
Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
  • 创建的新图像为m的一部分,具体的范围roi指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据
Mat::Mat(const Mat& m, const Rect& roi)

2. 初始化

  • 使用函数初始化
cv::Mat a = cv::Mat::eye(4, 4, CV_64FC1); // 单通道double类型
cv::Mat b = cv::Mat::eye(4, 4, CV_8UC1); // 单通道char类型
  • 使用cv::Point3f和cv::Mat_初始化;
cv::Point3f v1(34.0f, 21.34f, 32.0f);
cv::Mat m{ cv::Mat_<cv::Point3f>(v1) };
//得到1行1列3通道的矩阵 
  • 使用cv::Point3f初始化
cv::Point3f point(34.0f, 21.34f, 32.0f);
cv::Mat m(point);
//得到3行1列1通道的矩阵 
  • 使用vector初始化
std::vector<double> vec{ 21.3, -10, 34.0, 3.2, 3.4 };
cv::Mat m{ vec };
//得到5行1列1通道的矩阵 
  • 使用std::vector<cv::Point2f>初始化
//得到2行1列2通道的矩阵
std::vector<cv::Point2f> vecpts{ cv::Point2f(2.3, 3.1), cv::Point2f(9.3, -10.0) };
cv::Mat m{ vecpts };
  • 使用cv::Mat_初始化
//得到3行3列1通道的矩阵
cv::Mat C = (cv::Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

3. 对一部分进行赋值

这些方式看似正确,但实际不行

cv::Mat matrix = cv::Mat::zeros(4, 4, CV_64FC1);
cv::Mat calibration = cv::Mat::eye(3, 3, CV_64FC1);// 方法一
cv::Mat a = matrix.rowRange(0, 3).colRange(0, 3); // 共享内存
a = calibration; // 方法二
cv::Mat matrix = cv::Mat::zeros(4, 4, CV_64FC1);
matrix.rowRange(0, 3).colRange(0, 3) = calibration.clone();// 方法三
calibration.copyTo(matrix.rowRange(0, 3).colRange(0, 3)); // 编译失败

正确的方式

cv::Mat matrix = cv::Mat::zeros(4, 4, CV_64FC1);
cv::Mat a = matrix.rowRange(0, 3).colRange(0, 3); // 共享内存
xa.copyTo(a);
cv::Mat b = matrix.rowRange(0, 3).col(3); // 共享内存
xb.copyTo(b);

4. 与Eigen矩阵的相互转化

#include <opencv2/core/eigen.hpp>cv::cv2eigen(cv_matrix, eigen_matrx);cv::eigen2cv(eigen_matrx, cv_matrix);

5. 指针

cv::Mat matrix = cv::Mat::zeros(4, 4, CV_64FC1);// 方法一
const double *data = matrix.ptr<double>(0);// 方法二
// img.data的默认类型是unsigned char*
double* data = (matrix*)img.data;

6. cv::Mat的缺点

  • 弱类型

C++本来是强类型语言,但cv::Mat却是弱类型的,即当你拿到一个cv::Mat的时候你并不知道它里面存储的数据类型,很容易用错;

  • 不安全

当你把你的cv::Mat对象传给某函数时,即使函数的形参加了const关键字,但它依然可能会被修改,这是因为cv::Mat有共享内存机制,它的拷贝是浅拷贝;

  • 构造时间长

cv::Mat构造时间很长,如果非必要不建议使用,构造过程尽量写在循环外面;

7. 图像操作

  • 读入图像
cv::Mat A = imread(“Imgpath”, CV_LOAD_IMAGE_COLOR);A.at<Vec3b>(row, col)[2] // 访问图像数据

注意 Mat::at 函数是个模板函数, 需要指明参数类型, 因为这张图是具有红蓝绿三通道的图, 所以它的参数类型可以传递一个 Vec3b, 这是一个存放 3 个 uchar 数据的 Vec(向量). 这里提供了索引重载, [2]表示的是返回第三个通道, 在这里是 Red 通道, 第一个通道(Blue)用[0]返回

  • 保存图像
imwrite(image_path, A);
  • 将彩色图片转为灰度图片
Mat src(m, n CV_8UC3);
Mat dst;
cvtColor(src,dst,CV_BGR2GRAY);

参考文献

  • https://www.cnblogs.com/zi-wang/p/9800640.html
  • https://blog.csdn.net/qq_37406130/article/details/78725406

cv::Mat使用笔记相关推荐

  1. 为CV::Mat添加中文

    opencv自带的puttext函数,能够很方便地在Mat中添加英文字母.但是在实际项目中,甲方往往希望能够添加中文标识.解决的方法,总的来说有两种,一种是基于基础库的,比如我使用MFC,那么所有的显 ...

  2. OpenCV【零】—————cv::Mat——Mat对象创建方法

    OpenCV (一)--Mat对象创建方法 目录 OpenCV (一)--Mat对象创建方法 1. cv::Mat优点及原理(本质类) 2. Mat类拷贝及对象的创建方法 3. Mat 对象元素的高效 ...

  3. 【FFmpeg】使用sws_scale将AVFrame转换后的图像数据放入cv::Mat中

    1.方法一,伪代码如下 cv::Mat mat; AVFrame avFrame; const int stride[] = {static_cast<int>(mat.step[0])} ...

  4. 【OpenCV】正确创建用于保存YUV420P格式的cv::Mat

    1.问题描述 cv::Mat保存RGB24或BRG24格式时,传入宽.高和格式类型CV_8UC3就行了:今天在创建cv::Mat用来保存YUV420P时,有点懵圈了,因为类型是CV_8UC1,直接传宽 ...

  5. 【OpenCV】cv::Mat和std::vector之间的相互转换

    Mat转换成Vector 以vector 为例,其它模型类似 vector getVector(const Mat & a) { Mat b; a.convertTo(b, CV_64F); ...

  6. 错误 LNK2019 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo(class cv::debug_build_guard::_OutputArray

    错误 LNK2019 无法解析的外部符号 "public: void __cdecl cv::Mat::copyTo(class cv::debug_build_guard::_Output ...

  7. Layout of the output array img is incompatible with cv::Mat (step[ndims-1] !

    Layout of the output array img is incompatible with cv::Mat (step[ndims-1] https://blog.csdn.net/tqc ...

  8. 【opencv】4.初始化Mat的方式、访问cv::Mat中的某个元素

    可以参考:https://www.cnblogs.com/guoben/p/12728390.html 方法1: cv::Mat img_1 = cv::Mat::zeros(cv::Size(col ...

  9. 【OpenCV3】cv::Mat中的数据按行列写入txt文件中

    在使用opencv进行图像处理的过程中,经常会涉及到将文件中的数据读入到cv::Mat中,或者将cv::Mat中的数据写入到txt文件中. 下面就介绍一种我常用的将cv::Mat中的数据写入到txt文 ...

最新文章

  1. [自动化]Puppet服务安装和部署
  2. 幼儿课外活动游戏_幼儿园的户外活动游戏有哪些?
  3. android stuido 在线安装svn插件,添加版本库无响应
  4. 前端学习(1261):接口调用fetch方法
  5. DirectShow 在VS2005中环境配置
  6. 用css3的@keyframes里设置transform:rotate(); 当控制动画暂停:animation-play-state:paused暂停,在微信和safari里无效...
  7. Oracle典型应用场景--数据迁移到本地测试
  8. 网页性能优化{雅虎[转载]}
  9. primefaces教程_Primefaces AjaxBehavior和AjaxExceptionHandler组件示例教程
  10. 机器人视觉手眼标定学习笔记
  11. TLS 各种加密套件
  12. win10如何让外接显示器成为主显示器,笔记本屏幕成为拓展屏幕
  13. android 计时器服务,启动时使用计时器/alarmclock,更新服务_android_开发99编程知识库...
  14. java企查查爬_爬取企查查热搜
  15. 十大工业设计公司是如何排名的?
  16. [附源码]计算机毕业设计JAVA新能源汽车租赁管理系统
  17. 这一周通过了GoogleSummer of Code谷歌编程之夏
  18. element更改导航菜单被选中项的背景颜色
  19. 哪种服务器可以承载无限人数,云计算:揭秘1U服务器无限扩充能力
  20. Henry前端笔记之 CSS相关

热门文章

  1. 详解Silverlight Treeview的HierarchicalDataTemplate使用
  2. 每天60万人次在连接风险WiFi 有你吗
  3. WebSocket 协议
  4. 用函数制作简单的选项卡
  5. FileMaker中的腳本觸發器學習筆記
  6. 【C#】ASP.NET网页中添加单点登录功能
  7. 指针02 - 零基础入门学习C语言42
  8. 终于完成了“微软”化
  9. CV04-UNet笔记
  10. 从零学web前端_从零到前端英雄(第2部分)