三天学会opencv(三)——Mat对象

简介: 三天学会opencv(三)——Mat对象

Mat对象


学习内容


  1. Mat对象与IplImage对象
  2. Mat对象使用
  3. Mat定义数组

Mat对象与IplImage对象


Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分。

IplImage是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题。

总结一下:说白了就是IplImage这个对象他对于操作的容错性比较差,但是Mat类型就没有这个问题,属于OpenCV新时代的产物。

Mat对象构造函数常见的方法:

Mat()
Mat(int rows, int cols, int type)
Mat(Size size, int types)

…等等还有几个,但是我们常用的就是上面的。

常用的方法:

void copyTo(Mat src) // 完全拷贝
void convertTo(Mat dst, int type) // 数据类型的切换
Mat clone() // 深拷贝
int channels() // 获取通道数
int depth() // 图像深度
bool empty() // 是否为空
uchar* ptr(i = 0) // 图像的按行的指针,i等于行数,0位第一行

Mat对象的使用


部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分

Mat A= imread(imgFilePath);

Mat B(A) // 只复制

完全复制:如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现

Mat F = A.clone(); 

或者也可以下面这个实现

Mat G; A.copyTo(G);

Mat对象的创建


cv::Mat::Mat构造函数

Mat M(2,2,CV_8UC3, Scalar(0,0,255))

其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致

image.png

创建多维数组cv::Mat::create

int sz[3] = {2,2,2};     
Mat  L(3,sz, CV_8UC1, Scalar::all(0));

cv::Mat::create实现

Mat M;
M.create(4, 3, CV_8UC2);
M = Scalar(127,127);
cout << "M = " << endl << " " << M << endl << endl;
uchar* firstRow = M.ptr<uchar>(0);
printf("%d", *firstRow);

image.png

定义小数组


Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);     
cout << "C = " << endl << " " << C << endl << endl;

image.png

相关文章
|
7月前
|
存储 新制造 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C++)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C++)
92 2
|
2月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
72 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
7月前
|
存储 新制造 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)
79 0
|
6月前
|
存储 算法 API
OpenCV 3.1.0中的Mat对象使用
OpenCV 3.1.0中的Mat对象使用
49 2
|
6月前
|
存储 编解码 API
【图像文本化】Base64编解码OpenCV4中 Mat 对象
【图像文本化】Base64编解码OpenCV4中 Mat 对象
118 0
|
6月前
|
openCL API 计算机视觉
OpenCV3.x中UMat对象介绍与使用
OpenCV3.x中UMat对象介绍与使用
137 0
|
7月前
|
存储 定位技术 计算机视觉
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
102 1
|
7月前
|
计算机视觉
OpenCV(四):Mat支持的运算
OpenCV(四):Mat支持的运算
103 0
|
7月前
|
存储 计算机视觉
OpenCV(三):Mat类数据的读取
OpenCV(三):Mat类数据的读取
239 0
|
7月前
|
存储 Android开发 计算机视觉
OpenCV(二):认识Mat容器
OpenCV(二):认识Mat容器
126 0