一、Mat初始化
1.使用Mat构造函数

//方法一:
Mat M( 2, 2, CV_8UC3, Scalar(0,255,0) );//其实是2*6的矩阵,因为每个元素有3个通道。
Mat M1( 2, 2, CV_8UC1,Scalar(0) );//单通道
//方法二:
int sz[3] = {2, 2, 2};
Mat L( 3, sz, CV_8UC(1), Scalar::all(0) );

2.为已存在的IplImage指针创建信息头

IplImage* img = cvLoadImage("1.jpg",1);
Mat test(img);

3.利用create函数

M.create( 4, 4, CV_8UC2);//CV_8UC2里面的2表示2通道

4.采用Matlab形式的初始化方式

Mat E = Mat::eye(4, 4, CV_64F);
Mat O = Mat::ones(2, 3, CV_32F);
Mat Z = Mat::zeros(3, 3, CV_8UC1);

5.Mat矩阵比较小时,学会直接赋值的方法,即用Mat_

Mat C =(Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);//直接赋初始值的方法

6.使用数组或指针初始化

Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
Mat (Size size, int type, void *data, size_t step=AUTO_STEP)
example:
int a[2][3] = { 1, 2, 3, 4, 5, 6};
Mat m1(2,3,CV_32S,a);   //float 对应的是CV_32F,double对应的是CV_64F
cout << m1 << endl;

参考链接1

二、Mat访问

Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放"uchar"类型;如果是RGB彩色图,存放"Vec3b"类型。首先先看看图像的是怎么存储的。

单通道图像

多通道图像

单通道灰度图数据存放格式:

多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图:

opencv中,由于使用Mat.at访问数据时,必须正确填写相应的数据类型,因此必须弄清楚opencv中的数据类型与我们常用数据类型一一对应关系。

Mat_<uchar>---------CV_8U
Mat_<char>-----------CV_8S
Nat_<short>---------CV_16S
Mat_<ushort>--------CV_16U
Mat_<int>-----------CV_32S
Mat_<float>----------CV_32F
Mat_<double>--------CV_64F

CV_8U 8位无符号整数 (0…..255)
CV_8S 8 位符号整数 (-128…..127)
CV_16U 16 位无符号整数 (0……65535)
CV_16S 16 位符号整数 (-32768…..32767)
CV_32S 32 位符号整数 (-2147483648……2147483647)
CV_32F 32 位浮点数 (-FLT_MAX ………FLT_MAX,INF,NAN)
CV_64F 64 位浮点数 (-DBL_MAX ……….DBL_MAX,INF,NAN)

下面主要记录三种常见的访问Mat的方式:1.at访问 2.ptr访问 3.data访问
Mat中不管是以at访问还是ptr访问,都是行优先 ,先Y轴后X轴(即先行后列)

//方法1:
t = (double)getTickCount();Mat img1(1000, 1000, CV_32F);for (int i=0; i<1000; i++){for (int j=0; j<1000; j++){img1.at<float>(i,j) = 3.2f;}}t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());//***方法2************************************************************t = (double)getTickCount();Mat img2(1000, 1000, CV_32F);for (int i=0; i<1000; i++){for (int j=0; j<1000; j++){img2.ptr<float>(i)[j] = 3.2f;}}t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());//***方法3************************************************************t = (double)getTickCount();Mat img3(1000, 1000, CV_32F);float* pData = (float*)img3.data;for (int i=0; i<1000; i++){for (int j=0; j<1000; j++){*(pData) = 3.2f;pData++;}}t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());//***方法3************************************************************t = (double)getTickCount();Mat img4(1000, 1000, CV_32F);for (int i=0; i<1000; i++){for (int j=0; j<1000; j++){((float*)img3.data)[i*1000+j] = 3.2f;}}t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());

对比几种方法,速度测试如下:

测试结果
  Debug Release
方法1 139.06ms 2.51ms
方法2 66.28ms 2.50ms
方法3-1 4.95ms 2.28ms
方法3-2 5.11ms 1.37ms

可以看出在debug版本下测试,不同访问方法差别比较大,Release下还好,而且也可以采用和指针结合的方式来增加效率,比如

/*********加强版********/t = (double)getTickCount();Mat img5(1000, 1000, CV_32F);float *pData1;for (int i=0; i<1000; i++) { pData1=img5.ptr<float>(i);for (int j=0; j<1000; j++) { pData1[j] = 3.2f; } } t = (double)getTickCount() - t;printf("in %gms\n", t*1000/getTickFrequency());
  Debug Release
加强版 5.74ms 2.43ms

参考链接2
参考链接3
参考链接4
参考链接5
参考链接6

多通道Mat访问
用at进行多通道访问,对应的数据类型如下:
typedef Vec<uchar, 2> Vec2b; //无符号双通道 CV_8U:0~255
typedef Vec<uchar, 3> Vec3b; //无符号3通道
typedef Vec<uchar, 4> Vec4b;
typedef Vec<short, 2> Vec2s; //short型双通道 CV_16S:-32768~32767
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
typedef Vec<int, 2> Vec2i; //整型双通道 CV_32S:-2147483648~2147483647
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<float, 2> Vec2f; //浮点型双通道 CV_32F:1.1810-38~3.401038
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
typedef Vec<double, 2> Vec2d; //double型双通道 CV_64F:2.2310-308~1.7910308
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;

示例程序,创建及访问双通道Mat

#include <opencv2/core/core.hpp>
#include <iostream>using namespace std;
using namespace cv;int main()
{int i, j;Mat dimg(3, 5, CV_16SC2,Scalar(-5,5));//构造一个3*5的short型双通道矩阵cout << "原矩阵" << endl << dimg << endl;short int a=1,b=15;for (i = 0; i < dimg.rows; i++){for (j = 0; j < dimg.cols; j++){dimg.at<Vec2s>(i, j)[0] = a;//at<type>其中type由矩阵的类型确定dimg.at<Vec2s>(i, j)[1] = b;}}cout << "改变后矩阵" << endl << dimg << endl;system("pause");
}

参考链接6
参考链接7

欢迎大家点赞、收藏、评论,让更多的人看到哦~

OpenCV Mat矩阵(图像Mat)初始化及访问方法相关推荐

  1. OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解

    (一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多,我们现在先看一下M ...

  2. Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解

    一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多 3--使用Mat图像 ...

  3. 神经网络 pytorch 分类二维矩阵图像和一维向量的方法

    在网上找资料的过程中,发现并没有特别细致的讲解分类图像和分类一维向量的做法,导致我捅咕了有几天才弄明白,可能使我比较菜吧......现在在这里记录一下. 首先需要明确,前文我们已经讲解了包装数据集的方 ...

  4. OpenCv:Mat矩阵的初始化

    在研究Mat矩阵的初始化的时候,发现其不能像Matx轻量级矩阵那样,直接利用数组来进行初始化,而是利用一个内部的变量类型:Scalar来进行初始化的.参考手册中的构造函数如下所示: (1) Mat:: ...

  5. OpenCV学习笔记之Mat

    一. Mat介绍 在2001年刚刚出现的时候,OpenCV基于 C 语言接口而建.为了在内存(memory)中存放图像,当时采用名为 IplImage 的C语言结构体,时至今日这仍出现在大多数的旧版教 ...

  6. OpenCv--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解

    (一)Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数详解 1--Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类 2--创建一个Mat对象的方法很多,我们现在先看一下M ...

  7. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

  8. opencv 报错:Error: Assertion failed (data) in cv::Mat::at, file ... mat.inl.hpp, line 897(访问了不存在矩阵的像素)

    文章目录 opencv4报错 原因 解决方法 opencv4报错 这是源代码: #include <opencv2/opencv.hpp> #include <iostream> ...

  9. 关于OPENCV 访问外部传进来的Mat矩阵元素的问题

    C++基本是小白,大神莫要嘲笑啊.. 使用cv.HoughCircle的源码模板,又增加了一种方法圆弧检测方法: arcs = cv.HoughCircles(tmpEdge, tmpArcMask, ...

最新文章

  1. excel求和为什么是0_Excel教程:小小的N函数竟如此厉害
  2. 对抗机器学习(Adversarial Machine Learning)发展现状
  3. 我想做产品,实现一个非常优秀的电脑桌面记事本加闹钟
  4. 如何在验证集加噪声_如何使用Python构建机器学习模型
  5. Linux 添加alisa,Linux/shell命令的实际应用——alias增加自定义命令
  6. php图片提交,php+js实现图片的上传、裁剪、预览、提交示例
  7. vue 子页面调用父页面的参数_Flutter子组件调用父组件方法修改父组件参数
  8. 华为PIM-SSM配置实例
  9. Valid Palindrome LeetCode Java
  10. Python+selenium自动化 - 环境搭建
  11. ProteusPro(EDA工具软件) V8.9 _下载及安装
  12. javaWeb图书购物商城
  13. ubuntu中查看IP地址命令
  14. virtualbox 菜单栏不见了---如何调出来
  15. 云搜网盘助手域名更换公告
  16. Valens HDBaseT VCN2K HDMI 1.4接收/发送
  17. 怎样使用iPhone对Apple TV进行色彩平衡调整?
  18. Markdown文本编辑
  19. 修正牛顿法编程python_GitHub - Maples7/newtonMethod: 牛顿法求解复数域上x^4-1=0收敛域的程序 using Python...
  20. 2017-10-17离线赛

热门文章

  1. Flutter 导包 以及体验
  2. styleable cannot be resolved or is not a field
  3. 2018HDU多校训练-3-Problem G. Interstellar Travel
  4. 导致命令注入漏洞的php函数,PHP安全-函数
  5. Go 学习笔记(5)— 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、取地址和指针运算符
  6. MySQL 学习笔记(10)—— 联结表
  7. 牛客网刷题知识汇总3
  8. 有关 ecshop 属性 {$goods.goods_attr|nl2br} 标签的赋值问题
  9. C++:Lambda函数学习
  10. php 解决方案,php优化解决方案