#前言

Mat 是Opencv中很常用的一个图像容器类,图像在计算机中的存储形式是二进制字节流,其本质的存储形式如下图所示;



而一张图片是由很多像素点组成,单个像素点又会因为图像格式的不同而不同。例如彩色的RBG或者灰度图像。而在OpenCV中,则可以抽象成一个顺序排列的内存区域,里面保存了图像的所有像素信息,这里用Mat类封装了这些图像的信息,包括图像大小,类型等等,大大地简化了我们处理和操作图像。

#概念

Mat 是一个类,从最早的OpenCV是C语言风格发展到现在的C++风格,它对面向对象的支持更加友好。相比较于之前C结构的IplImage,Mat有更多有优点;

  1. 内存的分配与释放更加安全;
  2. 使用Mat可以使代码更加简洁;
  3. 对于图像数据的处理更加高效;

Mat基本上是一个包含两个数据部分的类:矩阵头(包含矩阵大小,用于存储的方法,存储矩阵的地址等信息)和指向包含矩阵的矩阵的指针。像素值(取决于选择存储的方法取任何维度)。矩阵头大小是恒定的,但是矩阵本身的大小可能随图像而变化,并且通常大几个数量级。OpenCV是一个图像处理库。它包含大量图像处理功能。为了解决计算挑战,大多数时候您最终会使用库的多个功能。因此,将图像传递给函数是一种常见的做法。我们不应该忘记我们正在讨论图像处理算法,这些算法往往计算量很大。我们要做的最后一件事是通过制作不必要的潜在大图像副本来进一步降低程序的速度。为解决此问题,OpenCV使用引用计数系统(Reference Counting System)。这个想法是每个Mat对象都有自己的头,但是矩阵可以通过让它们的矩阵指针指向同一个地址来共享它们的两个实例。此外,复制操作符只会将标题和指针复制到大矩阵,而不是数据本身。

#实战

1 基础操作

1初始化

    //CV_8UC(n), ..., CV_64FC(n)
Mat A(5,5,CV_64FC1,1);
std::cout << "A= " << endl << " " << A << endl; Mat B(5,5,CV_64FC1,2);
std::cout << "B= " << endl << " " << B << endl; Mat C(5,5,CV_64FC3,Scalar(6.0f,7.0f,8.0f));
std::cout << "C= " << endl << " " << C << endl; Mat D = Mat::eye(3,3,CV_64F);
std::cout << "D= " << endl << " " << D << endl; Mat E = Mat::ones(3,3,CV_64F);
std::cout << "E= " << endl << " " << E << endl; Mat F = Mat::zeros(3,3,CV_64F);
std::cout << "F= " << endl << " " << F << endl;

A=

[1, 1, 1, 1, 1;

1, 1, 1, 1, 1;

1, 1, 1, 1, 1;

1, 1, 1, 1, 1;

1, 1, 1, 1, 1]

B=

[2, 2, 2, 2, 2;

2, 2, 2, 2, 2;

2, 2, 2, 2, 2;

2, 2, 2, 2, 2;

2, 2, 2, 2, 2]

C=

[6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8;

6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8;

6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8;

6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8;

6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8, 6, 7, 8]

D=

[1, 0, 0;

0, 1, 0;

0, 0, 1]

E=

[1, 1, 1;

1, 1, 1;

1, 1, 1]

F=

[0, 0, 0;

0, 0, 0;

0, 0, 0]

2 读取图片

#include <iostream>
#include <opencv2/opencv.hpp> int main(char argc,char** argv){
cv::Mat img = cv::imread(argv[1],-1);
if(img.empty()){
return -1;
}
cv::imshow("Image",img);
cv::waitKey( 0 );
return 0;
}

3 图像ROI

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp> using namespace cv;
using namespace std; int main(int argc,char* argv[]){ Mat img_ori = imread(argv[1],IMREAD_COLOR);
std::cout << "row is " << img_ori.rows << std::endl;
std::cout << "col is " << img_ori.cols << std::endl;
// 取img_ori图像中坐标(0,0)为起点长50高50区域的图片
Mat img_des = img_ori( Rect(0, 0, 50, 50));
cv::namedWindow("img_des",cv::WINDOW_NORMAL);
imshow("img_des",img_des);
waitKey(0);
}

#参考:

https://docs.opencv.org/2.4/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html

https://docs.opencv.org/3.1.0/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56

OpenCV之Mat类使用总结的更多相关文章

  1. opencv中mat类介绍

    The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. It ...

  2. OpenCV 之 Mat 类

    以前看 OpenCV 的书,或者资料也好,遇到 Mat 类的介绍,一般都是匆匆带过,自以为已经很熟悉了,从来没有深入研究过. 结果前段时间面试了一家公司,被问到两个 Mat 的问题:一是,谈谈对 Ma ...

  3. OpenCV cv::Mat类

    using namespace cv; 1.Mat的声明: Mat m=Mat(rows, cols, type); Mat m=Mat(Size(width,height), type); type ...

  4. opencv关于Mat类中的Scalar()---颜色赋值

    这个 CvScalar就是一个可以用来存放4个double数值的数组(O'Reilly的书上写的是4个整型成员):一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的. typedef s ...

  5. 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换

    在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  6. vector类转换Mat类

    前言 一个个数据push back到vector之后,可以使用Mat()函数将vector类型转换为Mat类型. 在opencv中Mat类的构造函数中有一个构造函数可以直接把vector类转换为Mat ...

  7. 图像识别与OpenCV——Mat类与Mat_类的内存管理

    Mat_类是对Mat类的一个包装,其定义如下: template<typename _Tp> class Mat_ : public Mat { public: //只定义了几个方法 // ...

  8. 如何将OpenCV中的Mat类绑定为OpenGL中的纹理

    https://blog.csdn.net/TTTTzTTTT/article/details/53456324 如果要调用外接的USB摄像头获取图像通常使用OpenCV来调用,如何调用摄像头请参考本 ...

  9. opencv学习之路(4)、Mat类介绍,基本绘图函数

    一.Mat类创建 Mat img;//创建无初始化矩阵 Mat img1(,,CV_8UC1);//200行,100列(长200,宽100) Mat img2(Size(,),CV_8UC3,Scal ...

随机推荐

  1. L20 梯度下降、随机梯度下降和小批量梯度下降

    airfoil4755 下载 链接:https://pan.baidu.com/s/1YEtNjJ0_G9eeH6A6vHXhnA 提取码:dwjq 梯度下降 (Boyd & Vandenbe ...

  2. ASE课程总结 by 张葳

    本期ASE课程分为两个阶段,第一阶段的personal project与第二阶段的team project,其中,第一阶段旨在锻炼我们个人的问题解决能力和编程能力,第二阶段则锻炼主要我们的管理能力,合 ...

  3. google protobuf c++ 反射

    const Descriptor *desc = DescriptorPool::generated_pool()->FindMessageTypeByName(msg_name); asser ...

  4. 零基础的学习者应该怎么开始学习呢?Python核心知识学习思维分享

    近几年,Python一路高歌猛进,成为最受欢迎的编程语言之一,受到无数编程工作者的青睐. 据悉,Python已经入驻部分小学生教材,可以预见学习Python将成为一项提高自身职业竞争力的必修课.那么零 ...

  5. selenium 窗口的切换

    窗口切换需要用到一个关键词:句柄,每个窗口唯一的标识 获取句柄的方法:driver.getWindowHandle(); 下面的例子是点击京东页面,跳转到京东手机页面,然后关闭京东页面 driver. ...

  6. 两种异常(CPU异常、用户模拟异常)的收集

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 两种异常(CPU异常.用户模拟异常)的收集  文章的核心:异常收集 ...

  7. Mysql表的对应关系

    表关系 一对一一张表中的一条记录与另一张表中最多有一条明确的关系:通常,此设计方案保证两张表中使用同样的主键即可假设一张学生表:id 姓名 年龄 性别 籍贯 婚否 住址那么姓名 年龄 性别 这种字段比 ...

  8. python工业互联网监控项目实战4—python opcua

    前面章节我们采用OPC作为设备到上位的信息交互的协议,本章我们介绍跨平台的OPC UA.OPC作为早期的工业通信规范,是基于COM/DCOM的技术实现的,用于设备和软件之间交换数据,最初,OPC标准仅 ...

  9. 用Python打造电脑人脸屏幕解锁神器附带接头暗号!

    前言 最近突然有个奇妙的想法,就是当我对着电脑屏幕的时候,电脑会先识别屏幕上的人脸是否是本人,如果识别是本人的话需要回答电脑说的暗语,答对了才会解锁并且有三次机会.如果都没答对就会发送邮件给我,通知有 ...

  10. Java 反射调用方法 - 不跳过安全检查、跳过安全检查和普通方法性能比较测试

    java中反射提供灵活性同时,给运行效率带来了一定影响.写个代码测试一下 package com.xzlf.reflectTest; import java.lang.reflect.Method; ...