04- OpenCV:Mat对象简介和使用

这篇具有很好参考价值的文章主要介绍了04- OpenCV:Mat对象简介和使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、Mat对象与IplImage对象

2、Mat对象使用

3、Mat定义数组

4、相关的代码演示


1、Mat对象与IplImage对象

先看看Mat对象:图片在计算机眼里都是一个二维数组;

在OpenCV中,Mat是一个非常重要的类,用于表示图像或矩阵数据。

04- OpenCV:Mat对象简介和使用,OpenCV,opencv,人工智能,计算机视觉,Mat对象的讲解

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

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

(3)Mat对象构造函数与常用方法

  1. 构造函数:

    • Mat(): 默认构造函数,创建一个空的Mat对象。
    • Mat(int rows, int cols, int type): 创建指定行数、列数和类型的Mat对象。
    • Mat(Size size, int type): 创建指定尺寸和类型的Mat对象。
    • Mat(int rows, int cols, int type, Scalar scalar): 创建指定行数、列数、类型和初始值的Mat对象。
  2. 常用方法:

    • rows(): 返回Mat对象的行数。
    • cols(): 返回Mat对象的列数。
    • size(): 返回Mat对象的尺寸(行数和列数)。
    • type(): 返回Mat对象的数据类型。
    • empty(): 检查Mat对象是否为空。
    • at<T>(int row, int col): 返回指定位置的元素值,其中T是元素的数据类型。
    • ptr<T>(int row): 返回指定行的指针,其中T是元素的数据类型。
    • clone(): 复制Mat对象并返回副本。
    • convertTo(Mat& dst, int type, double alpha=1, double beta=0): 将Mat对象转换为指定类型,并可选地进行缩放和偏移。
    • reshape(int cn, int rows=0): 改变Mat对象的通道数和行数。
    • int channels(): 返回Mat对象的通道
    • int depth(): 返回Mat对象深度
2、Mat对象使用

(1)复制

        1)部分复制:一般情况下只会复制Mat对象的头和指针

        部分,不会复制数据部分

Mat A= imread(imgFilePath);

Mat B(A)  // 只复制

        2)完全复制:如果想把Mat对象的头部和数据部分一起

复制,可以通过如下两个API实现

Mat F = A.clone();

或 Mat G; A.copyTo(G);

(2)Mat对象使用-四个要点

        1)输出图像的内存是自动分配的

        2)使用OpenCV的C++接口,不需要考虑内存分配问题

        3)赋值操作和拷贝构造函数只会复制头部分

        4)使用clone与copyTo两个函数实现数据完全复制

(3)Mat对象创建

        1)cv::Mat::Mat构造函数     

04- OpenCV:Mat对象简介和使用,OpenCV,opencv,人工智能,计算机视觉,Mat对象的讲解

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

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

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

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

        3)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);

04- OpenCV:Mat对象简介和使用,OpenCV,opencv,人工智能,计算机视觉,Mat对象的讲解

3、Mat定义数组

(1)定义小数组文章来源地址https://www.toymoban.com/news/detail-809335.html

Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);     
cout << "C = " << endl << " " << C << endl << endl;
4、相关的代码演示
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
	Mat src;
	src = imread("D:/vcprojects/images/test.png");
	if (src.empty()) {
		cout << "could not load image..." << endl;
		return -1;
	}
	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src);

	/*Mat dst;
	dst = Mat(src.size(), src.type());
	dst = Scalar(127, 0, 255);
	namedWindow("output", CV_WINDOW_AUTOSIZE);
	imshow("output", dst);*/
	Mat dst;
	//src.copyTo(dst);
	namedWindow("output", CV_WINDOW_AUTOSIZE);

	cvtColor(src, dst, CV_BGR2GRAY);
	printf("input image channels : %d\n", src.channels());
	printf("output image channels : %d\n", dst.channels());

	int cols = dst.cols;
	int rows = dst.rows;

	printf("rows : %d cols : %d\n", rows, cols);
	const uchar* firstRow = dst.ptr<uchar>(0);
	printf("fist pixel value : %d\n", *firstRow);

	Mat M(100, 100, CV_8UC1, Scalar(127));
	//cout << "M =" << endl << M << endl;

	Mat m1;
	m1.create(src.size(), src.type());
	m1 = Scalar(0, 0, 255);

	Mat csrc;
	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(src, csrc, -1, kernel);

	Mat m2 = Mat::eye(2, 2, CV_8UC1);
	cout << "m2 =" << endl << m2 << endl;

	imshow("output", m2);
	waitKey(0);
	return 0;
}

到了这里,关于04- OpenCV:Mat对象简介和使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv03-Mat矩阵API的使用

    构造方法(具体介绍看API文档) 成员方法 成员方法 create

    2024年02月14日
    浏览(50)
  • 人工智能算法工程师面试题——之OpenCV必背汇总(四)

    在OpenCV中,图像融合通常指的是将两个或更多图像以某种方式组合在一起,以创建一个新的图像。这个过程可以用于多种目的,比如艺术效果、图像修复或信息增强。实现图像融合的一种常见方法是通过加权求和,也就是每个像素位置上将不同图像的像素值按照一定的权重相

    2024年02月21日
    浏览(50)
  • [C++] opencv - Mat::convertTo函数介绍和使用场景

    Converts an array to another data type with optional scaling.    该函数主要用于数据类型的相互转换。 The method converts source pixel values to the target data type. saturate_cast is applied at the end to avoid possible overflows: m(x,y)=saturate_castrtype(α(∗this)(x,y)+β)    这是函数底层算法实现公式,了解算法方便我们

    2024年01月18日
    浏览(52)
  • C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]

    C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值] 矩阵创建 图像显示与保存 像素读取与赋值 新建sample02项目,配置opencv4相关包,新建 .cs 进行测试 两种常用的图像遍历方式 灰度图操作 三通道图操作 完整代码

    2024年02月03日
    浏览(47)
  • 【c++ Opencv】Opencv中Mat的一些相关操作

    C++中的Mat类是OpenCV库中最核心的数据结构之一,用于表示图像和矩阵等二维、三维数据。Mat类的主要特点是可轻松地访问像素点,支持各种矩阵运算,可以实现各种图像处理算法。下面是一些常见的Mat操作: 1. 创建Mat对象:可以通过构造函数、静态方法或赋值操作符来创建

    2024年02月13日
    浏览(37)
  • <OpenCV> Mat属性

    OpenCV的图像数据类型可参考之前的博客:https://blog.csdn.net/thisiszdy/article/details/120238017 OpenCV-Mat类型的部分属性如下: size:矩阵的大小, s i z e ( c o l s , r o w s ) size(cols,rows) s i ze ( co l s , ro w s ) ; elemSize():矩阵一个元素占用的字节数( 通道数 ∗ 位数 / 8 通道数*位数/8 通道数

    2024年02月09日
    浏览(39)
  • Opencv::Mat的学习

    OpenCV中6种访问Mat元素的方法_opencv 访问mat元素_JIN_嫣熙的博客-CSDN博客

    2024年02月11日
    浏览(44)
  • OpenCV(Mat类)

    目录 1、什么是Mat类 2、Mat类组成  3、Mat类能存储的数据类型  4.Mat类的创建 4.1 利用矩阵宽、高和类型参数创建  4.2 利用矩阵Size()结构和数据类型参数来创建 4.3 利用已有Mat类来创建  5、Mat类的赋值 5.1 创建时赋值 5.2 类方法赋值 5.3 枚举赋值  6、Mat类数据的读取 6.1 Mat类的常

    2024年02月12日
    浏览(37)
  • 【OpenCV】浅谈 Mat 类

    1、Mat类介绍 Mat 类是一个用于保存图像数据或者矩阵数据的数据结构,可以说是一个矩阵类, 在OpenCV 1.0时代,存储图像数据都是使用C语言中的一个结构体IplImage,很麻烦的是IplImage需要在程序结束的时候手动释放内存,就跟我们现在malloc过来的堆区空间一样。 不过随着Open

    2024年02月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包