cv::Mat是OpenCV2和OpenCV3中基本的数据类型,在cv::Mat类中,关于cv::Mat的定义和初始化有多种不同的形式,这里,将对其进行详尽的总结和介绍。
一、无数据拷贝的cv::Mat的定义和初始化
1、默认形式
cv::Mat m;
2、指定类型和大小(行列)的二维数组
cv::Mat m(int rows, int cols, int type);
3、有初始化值的指定类型和大小
(行列)
的二维数组
cv::Mat m(int rows, int cols, int type, const Scalar& s);
4、使用预先存在数据定义的指定类型和大小
(行列)
的二维数组
cv::Mat m(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);
5、指定大小(size)和类型的二维数组
cv::Mat m(cv::Size sz, int type, const Scalar& s);
6、使用预先存在的数据定义的指定大小(size)和类型的二维数组
cv::Mat m(cv::Size sz, int type, void* data, size_t step = AUTO_STEP);
7、指定类型的多维数组
cv::Mat m(int ndims, const int* sizes, int type);
8、有初始化值的指定类型多维数组
cv::Mat m(int ndims, const int* sizes, int type, const Scalar& s);
9、
使用预先存在的数据定义的指定类型的多维数组
cv::Mat m(int ndims, const int* sizes, int type, void* data, size_t step = AUTO_STEP);
二、从其他cv::Mat进行数据拷贝的定义和初始化
1、拷贝构造形式
cv::Mat m(const cv::Mat& mat);
2、指定行列范围的拷贝构造
cv::Mat m(const cv::Mat& mat, const cv::Range& rows, const cv::Range& cols);
3、指定ROI的拷贝构造
cv::Mat m(const cv::Mat& mat, const cv::Rect& roi);
4、使用多维数组中指定范围内的数据的拷贝构造
cv::Mat(const cv::Mat& mat, const cv::Range* ranges);
三、使用OpenCV中的模板进行定义和初始化
1、使用cv::Vec定义相同类型、大小为n的一维数组
cv::Mat m(const cv::Vec<T, n>& vec, bool = copyData = true);
2、使用cv::Matx定义相同类型、大小为mxn的二维数组
cv::Mat(const cv::Matx<T, m, n>& vec, bool copyData = true);
3、使用STL vector定义相同类型的一维数组
cv::Mat(const std::vector<T>& vec, bool copyData = true);
四、直接使用静态函数创建cv::Mat
1、使用zeros()函数定义指定大小和类型的cv::Mat(全为0)
cv::Mat m = cv::Mat::zeros(int rows, int cols, int type);
2、使用ones()函数定义指
定大小和类型的cv::Mat
(全为0)
cv::Mat m = cv::Mat::ones(int rows, int cols, int type);
3、使用eye()函数定义指
定大小和类型的cv::Mat(恒等矩阵)
cv::Mat m = cv::Mat::eye(int rows, int cols, int type);
cv
::
Mat
初识
Opencv
种的
Mat
类,使得
Opencv
的编程更加的简单,程序员不用过多的去关注内存管理,并且发现
Opencv
的编程有点像不需要太多编程技术的
Mat
lab一样,甚至有些函数名字都是一样的。所以对
Mat
的了解是很有必要的。
首先我们在处理一块数据的时候,如果使用
Mat
类,我们得到的好处是:
不需要手动申请一块内存;
在不需要时不用再手动释放内存;
可以通过类的封装...
原文链接:https://blog.csdn.net/guduruyu/article/details/66973415
cv
::
Mat
是
Opencv
2和
OpenCV
3中基本的数据类型,在
cv
::
Mat
类中,关于
cv
::
Mat
的
定义
和
初始化
有多种不同的形式,下面对其进行总结。
一、无数据拷贝的
cv
::
Mat
的
定义
和
初始化
1、默认形式
cv
::
Mat
m;
2、指定类型和大小(行列)的二维数组
转载自官方教程 https://docs.
opencv
.org/master/db/da5/tutorial_how_to_scan_images.html
官方给出的代码: https://github.com/
opencv
/
opencv
/blob/master/samples/cpp/tutorial_code/core/how_to_scan_images/how_to_scan_imag...
#include <
opencv
2/
opencv
.hpp>
#include <
opencv
2/imgproc/imgproc.hpp>
#include <
opencv
2/highgui/highgui.hpp>
int main()
//
定义
一个float数组
float a[4] = {1,2,3,4};
//将数组转换为矩阵,2行2列的矩阵
cv
::
cv
::
Mat
是
OpenCV
用来记录大型数组的主要类型,可以视为是
OpenCV
所有
C++
实现的核心,
OpenCV
所有主要函数都是
cv
::
Mat
类的成员,或是将
cv
::
Mat
作为参数,或是返回一个
cv
::
Mat
类型。
cv
::
Mat
类用于表示任意维度的稠密数组。“稠密”表示该数组的所有部分都有一个值存储,即使这个值是0;对于大多数图像来说,都是以稠密数组的形式存储的;与之稠密数组对应的是稀疏数组,用于存储只有非0的数值。注意:在数组比较稠密的时候,稀疏数组反而会浪费大量内存。
cv
::
Mat
类N维稠密
一、图像的表示
一副尺寸为 M × N 的图像可以用一个 M × N 的矩阵来表示,矩阵元素的值表示这个位置上的像素的亮度,一般来说像素值越大表示该点越亮。一般来说,灰度图用 2 维矩阵表示,彩色(多通道)图像用 3 维矩阵(M× N × 3)表示。对于图像显示来说,目前大部分设备都是用无符号 8 位整数(类型为
CV
_8U) 表示像素亮度。图像数据在计算机内存中的存储顺序为以图像最左上点(也可能是最左下点)开始, 存储如图所示。
Iij 表示第 i 行 j 列的像素值。如果是多通道图像,