首页 > 其他分享 >【OpenCV】:浅析 OpenCV 中的图像数据结构 Mat

【OpenCV】:浅析 OpenCV 中的图像数据结构 Mat

时间:2024-01-21 21:46:52浏览次数:26  
标签:const Mat int OpenCV Scalar type 浅析 size

以下内容主要来自 OpenCV 中的 mat.hpp 这个头文件

关于 Mat

Mat 是 OpenCV 中用来存储图像数据的基础数据结构,原话是

It can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms may be better stored in a SparseMat ).

可以用来存储实数或者复数向量或者矩阵,灰度图或者彩色图,体素,向量场,点云,张量图,直方图。

创建 Mat 的方式有很多种,最常用的是指定 mat 的行数、列数以及类型,比如

// 创建一个有 2 个通道 7x7 的矩阵,两通道分别赋值为 1 和 3,数据类型为 Float.
Mat M(7, 7, CV_32FC2, Scalar(1, 3));
// 类似第一个,创建一个具有 15 通道,100x60 的矩阵
M.create(100, 60, CV_8UC(15));
// 创建一个 100x100x100 的 U8 数组
int sz[] = {100, 100, 100};
Mat bigCube(3, sz, CV_8U, Scalar::all(0));
  • Use a copy constructor or assignment operator where there can be an array or expression on the
    right side (see below). As noted in the introduction, the array assignment is an O(1) operation
    because it only copies the header and increases the reference counter. The Mat::clone() method can
    be used to get a full (deep) copy of the array when you need it.

上面说的是可以使用数组或者表达式来进行拷贝构造或者赋值,其中赋值操作复杂度为 O(1),因为只需要复制首地址然后增加引用计数即可,如果想要进行深拷贝可以使用 Mat::clone() 方法;这一特性可以帮助我们来操作 Mat 中存储的元素,比如:

// add the 5-th row, multiplied by 3 to the 3rd row
M.row(3) = M.row(3) + M.row(5)*3;
// now copy the 7-th column to the 1-st column
// M.col(1) = M.col(7); // this will not work
Mat M1 = M.col(1);
M.col(7).copyTo(M1);
// create a new 320x240 image
Mat img(Size(320,240),CV_8UC3);
// select a ROI
Mat roi(img, Rect(10,10,100,100));
// fill the ROI with (0,255,0) (which is green in RGB space);
// the original 320x240 image will be modified
roi = Scalar(0,255,0);

下面介绍一些 Opencv 中 Mat 的初始化方法:

Mat(int rows, int cols, int type);

// @param size 2D array size: Size(cols, rows)
Mat(Size size, int type);

/** @param s An optional value to initialize each matrix element with. To set all the matrix elements to the particular value after the construction, use the assignment operator 
Mat::operator=(const Scalar& value) .
*/
Mat(int rows, int cols, int type, const Scalar& s);

Mat(Size size, int type, const Scalar& s);

Mat(int ndims, const int* sizes, int type);
Mat(int ndims, const int* sizes, int type, const Scalar& s);

// 使用另一个 Mat 数据来初始化 Mat
Mat(const Mat& m);

// 将 Mat 的头指针指向 data,不进行内存分配操作,这样就可以借助 Mat 数据结构来处理 data 这个指针指向的内存数据,处理完之后要自己手动释放 data 指向的内存
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);
Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);

// 使用另一个 Mat 中的 ROI 数据来初始化 Mat
Mat(const Mat& m, const Rect& roi);

标签:const,Mat,int,OpenCV,Scalar,type,浅析,size
From: https://www.cnblogs.com/hhuxty/p/17971589

相关文章

  • Python Matplotlib 常见图形绘制
    ​ 参考文档:PythonMatplotlib常见图形绘制-CJavaPy1、折线图(LinePlot)绘制折线图(LinePlot)是一项基础且常用的功能。折线图非常适合展示数据随时间或其他连续变量变化的趋势。使用plt.plot() 函数用于在坐标轴上绘制折线图(LinePlot),它提供了多种参数来自定义图像的外观。......
  • Rocketmq学习3——消息发送原理源码浅析
    一丶概述RocketMQ消息发送的原理流程可以分为以下几个步骤:1.创建生产者在发送消息前,客户端首先需要创建一个消息生产者(Producer)实例,并设置必要的配置参数,如NameServer地址、生产组名称、消息发送失败的重试次数等。2.启动生产者创建生产者后,需要调用启动方法来初始化生产......
  • 数据前置参数类型转换@InitBinder、Formatter<?>、Converter<?>的使用
    前言:在很多时候我们在进行调用接口的时候,传入的参数类型不是指定的特别明确(或者是不能进行自动类型转换),会导致调用接口失败的情况出现,如果我们在调用接口之前进行数据格式化,手动进行数据类型转换,那么就不会出现调用接口失败的情况出现了。这些注解无非也就是做这些工作的。下面列举......
  • Python Matplotlib 多个坐标系下绘制多个图像
    ​ 1、绘制图像使用 plt.subplots()可以创建一个图形对象以及一个或多个子图(axes)对象。使得在同一个窗口中绘制多个图像变得非常简单和直观。使用 plt.subplots(),可以轻松地管理多个子图的布局,并且可以对每个子图进行独立的绘图和自定义设置。常用参数如下,参数说明......
  • 无涯教程-MATLAB - Octave
    GNUOctave是像MATLAB这样的高级编程语言,它与MATLAB大部分兼容。它也用于数值计算。Octave与MATLAB具有以下共同特征-矩阵是基本数据类型它具有对复数的内置支持它具有内置的数学函数和库它支持用户定义的函数GNUOctave也是可免费重新发行的软件,您可以根据自由软件基金会......
  • Matlab-pcolor绘制二维色温图并修改温度条颜色
    figure(3)pcolor(time,yData',data1.ConVel')shadinginterp;colorbar;color_1=[0,0,1];color_2=[1,1,1];color_3=[1,0,0];num12=45;num23=25;R_mat=[linspace(color_1(1),color_2(1),num12),linspace(color_2(1),color_3(1),num23)];G_mat=[linspace(col......
  • 无涯教程-MATLAB - 变换(Transforms)
    MATLAB提供了用于处理变换的命令,例如Laplace和Fourier变换,转换在科学和工程中用作简化分析并从另一个角度查看数据的工具。例如,傅立叶变换允许我们将表示为时间函数的信号转换为频率函数,拉普拉斯变换使我们能够将微分方程转换为代数方程。MATLAB提供了laplace,傅立叶和fft命......
  • 无涯教程-MATLAB - 多项式(Polynomials)
    MATLAB将多项式表示为行向量,其中包含按降序排序的系数。例如,方程P(x)=x4+7x3-5x+9可以表示为-p=[170-59];判断多项式polyval函数用于以指定值判断多项式。例如,要判断我们先前的多项式p,在x=4处,键入-p=[170-59];polyval(p,4)MATLAB执行上述语句并返......
  • 无涯教程-MATLAB - 代数(Algebra)
    到目前为止,我们已经看到所有示例都可以在MATLAB及其GNU(也称为Octave)中运行,但是对于求解基本的代数方程,MATLAB和Octave几乎没有什么不同,因此我们将尝试在单独的部分中介绍MATLAB和Octave。我们还将讨论代数表达式的分解和简化。MATLAB中代数方程solve函数用于求解代数方程,......
  • 无涯教程-MATLAB - 微积分(Calculus)
    MATLAB提供了多种方法来解决微分和积分问题,求解任意程度的微分方程式以及计算极限,最重要的是,您可以轻松求解复杂函数的图,并通过求解原始函数及其导数来检查图上的最大值,最小值。本章将讨论微积分的问题,在本章中,我们将讨论预演算的概念,即计算函数的极限并验证极限的性质。计算极......