opencv c++ (1):创建Mat对象的常用方法

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

1. 前言

对于学过的东西,想系统记录一下,这里记录的是在Ai 旅途中常用到的opencv 相关知识,快速带你进阶opencv

2. Mat类

opencv c++ 中最常见的就是Mat类型。Mat 它是一个类,它所创建的对象类似于python 版opencv 中numpy 数据结构,因此也可以把他理解为一个存放矩阵的容器。Mat类的详细介绍可以看官网的API,OpenCV: cv::Mat Class Reference

3. 创建Mat

如何创建Mat 对象,关键要知道它有哪些构造函数,下面介绍常用的一些构造函数。

3.1 Mat () 

Mat()是默认构造函数 。如下隐式创建一个Mat型的m,它不包含任何数据。

#include <iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;

int main()
{

	Mat m;  // 隐式调用, 显示调用为: Mat m = Mat(); 

	return 0;
}

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

Mat m(4, 4, CV_8UC3);

rows是矩阵的行,可以理解为图片的高;cols是矩阵的列,可以理解为图片的宽;type是mat的类型,形式为CV_深度_通道数。具体参看第4章节。

如下创建4*4的3通道的蓝色的一个图

#include "opencv01.h"
#include <iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
    Mat m(4, 4, CV_8UC3);
    namedWindow("m", WINDOW_NORMAL);
    m = Scalar(255, 0, 0); //BGR
    cout << endl << m << endl;
    imshow("m", m);
    waitKey(0);

    return 0;
}

c++ mat,c++,opencv,人工智能,计算机视觉

3.3 Mat(int rows, int cols, int type, const Scalar& s)

Mat m(4, 4, CV_8UC3, Scalar(255, 0, 0));

与3.2一个意思。

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

Mat m(Size(4, 4), CV_8UC3, Scalar(255, 0, 0));

与3.2一个意思。

3.5 Mat(int n, const int* size, int type, const Scalar& s)

创建一个全0的3维数组
 int ar[] = {3,2,4};
 Mat m(3, ar, CV_8UC1, Scalar::all(0));

3.6 其他方法

//复制构造函数

Mat m = src; //等价于Mat m(src)

Mat m(src);

Mat m = imread(string path); //读图

//复制构造函数 + 静态方法

Mat m1 = Mat::zeros(Size(4, 5), CV_8UC3); //全0
Mat m2 = Mat::ones(Size(4, 5), CV_8UC3);  //全1
Mat m3 = Mat::eye(Size(4, 5), CV_8UC3);   //单位矩阵 

//creat方法

Mat m;

m.create(int _rows, int _cols, int _type);

m.create(Size _sz, int _type);

...

3.7 Mat 的常用属性方法

...

    Mat m(cv::Size(4,5), CV_8UC3, Scalar(0,255,0));
   
    cout << endl << m << endl;

    //属性
    cout << "维度:" << m.dims << endl;
    cout << "行:" << m.rows << endl;
    cout << "列:" << m.cols << endl;
    cout << "形状:" << m.size << endl; //宽、高
    cout << "宽:" << m.size[0] << "\t" << "高:" << m.size[1] << endl;

    //方法
    cout << "通道数:" << m.channels() << endl;
    cout << "深度:" << m.depth() << endl;
    
...

结果:

[  0, 255,   0,   0, 255,   0,   0, 255,   0,   0, 255,   0;
   0, 255,   0,   0, 255,   0,   0, 255,   0,   0, 255,   0;
   0, 255,   0,   0, 255,   0,   0, 255,   0,   0, 255,   0;
   0, 255,   0,   0, 255,   0,   0, 255,   0,   0, 255,   0;
   0, 255,   0,   0, 255,   0,   0, 255,   0,   0, 255,   0]
维度:2
行:5
列:4
形状:5 x 4
宽:5   高:4
通道数:3
深度:0

4. Mat的数据类型type参数

以下表二是opencv 中定义的所有类型,其形式是CV_深度_通道数,如CV_8UC3,代表深度为8位无符号3通道数据类型。

mat 中有个depth()的成员函数,其返回值就是深度,如下表一:

对于图像来说基本上只会用到CV_8UC(n),其他看看了解一下就可以了。一般图像,记住一下几个就可以了。

C1 :单通道,灰色

C3 :三通道,BGR

C4 :四通道,BGRA, A代表透明度

像素深度 = 8 * 通道数。因为我们正常显示的图片都是CV_8U。imshow函数在显示图像时,会将各种类型的数据都映射到[0, 255]。

我们看一下代码:

#include<opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
    Mat m1(512, 512, CV_8UC3, Scalar(0, 255, 0));
    Mat m2(512, 512, CV_16UC3, Scalar(0, 255, 0));
    imshow("m1", m1);
    imshow("m2", m2);
    imwrite("m1.jpg", m1);
    imwrite("m2.jpg", m2);
    waitKey(0);
    return 0;
}

结果:由于m2是CV_16UC3类型,其值[0, 65535]映射到[0, 255]就看起来是黑色的,

c++ mat,c++,opencv,人工智能,计算机视觉

然后我们看一下保存的m1.jpg和m2.jpg,如下,我们可以看到图片都是绿色的,而且位深度都是8*3 = 24, 这说明,我们的jpg图片数据只能是8U格式。因此我们在用opencv做图像处理的时候一般定义mat为8U的格式。

c++ mat,c++,opencv,人工智能,计算机视觉

c++ mat,c++,opencv,人工智能,计算机视觉

表一:

返回值 深度 含义 取值范围
0 CV_8U 8位无符号整数 0~255
1 CV_8S 8位有符号整数 -128~127
2 CV_16U 16位无符号整数 0~65535
3 CV_16S 16位有符号整数 -32768~35767
4 CV_32S 32位有符号整数 -2147483648~-2147483647
6 CV_32F 32位单精度浮点数 -FLA_MAX~FLA_MAX
7 CV_64F 64位双精度浮点数 -DBL_MAX~DBL_MAX

表二:文章来源地址https://www.toymoban.com/news/detail-718442.html

#define  CV_8UC1   CV_MAKETYPE(CV_8U,1)
#define  CV_8UC2   CV_MAKETYPE(CV_8U,2)
#define  CV_8UC3   CV_MAKETYPE(CV_8U,3)
#define  CV_8UC4   CV_MAKETYPE(CV_8U,4)
#define  CV_8UC(n)   CV_MAKETYPE(CV_8U,(n))
#define  CV_8SC1   CV_MAKETYPE(CV_8S,1)
#define  CV_8SC2   CV_MAKETYPE(CV_8S,2)
#define  CV_8SC3   CV_MAKETYPE(CV_8S,3)
#define  CV_8SC4   CV_MAKETYPE(CV_8S,4)
#define  CV_8SC(n)   CV_MAKETYPE(CV_8S,(n))
#define  CV_16UC1   CV_MAKETYPE(CV_16U,1)
#define  CV_16UC2   CV_MAKETYPE(CV_16U,2)
#define  CV_16UC3   CV_MAKETYPE(CV_16U,3)
#define  CV_16UC4   CV_MAKETYPE(CV_16U,4)
#define  CV_16UC(n)   CV_MAKETYPE(CV_16U,(n))
#define  CV_16SC1   CV_MAKETYPE(CV_16S,1)
#define  CV_16SC2   CV_MAKETYPE(CV_16S,2)
#define  CV_16SC3   CV_MAKETYPE(CV_16S,3)
#define  CV_16SC4   CV_MAKETYPE(CV_16S,4)
#define  CV_16SC(n)   CV_MAKETYPE(CV_16S,(n))
#define  CV_32SC1   CV_MAKETYPE(CV_32S,1)
#define  CV_32SC2   CV_MAKETYPE(CV_32S,2)
#define  CV_32SC3   CV_MAKETYPE(CV_32S,3)
#define  CV_32SC4   CV_MAKETYPE(CV_32S,4)
#define  CV_32SC(n)   CV_MAKETYPE(CV_32S,(n))
#define  CV_32FC1   CV_MAKETYPE(CV_32F,1)
#define  CV_32FC2   CV_MAKETYPE(CV_32F,2)
#define  CV_32FC3   CV_MAKETYPE(CV_32F,3)
#define  CV_32FC4   CV_MAKETYPE(CV_32F,4)
#define  CV_32FC(n)   CV_MAKETYPE(CV_32F,(n))
#define  CV_64FC1   CV_MAKETYPE(CV_64F,1)
#define  CV_64FC2   CV_MAKETYPE(CV_64F,2)
#define  CV_64FC3   CV_MAKETYPE(CV_64F,3)
#define  CV_64FC4   CV_MAKETYPE(CV_64F,4)
#define  CV_64FC(n)   CV_MAKETYPE(CV_64F,(n))
#define  CV_16FC1   CV_MAKETYPE(CV_16F,1)
#define  CV_16FC2   CV_MAKETYPE(CV_16F,2)
#define  CV_16FC3   CV_MAKETYPE(CV_16F,3)
#define  CV_16FC4   CV_MAKETYPE(CV_16F,4)
#define  CV_16FC(n)   CV_MAKETYPE(CV_16F,(n))

到了这里,关于opencv c++ (1):创建Mat对象的常用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • opencv常用函数,QT中Mat与QImage的转换

    opencv是一个跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上,实现了图像处理和计算机视觉方面的很多通用算法。 Mat imread( const String filename, int flags = IMREAD_COLOR );是从指定文件载入一幅图像 filename:要读入图片的完整路径 flags:读入图片

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

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

    2024年02月13日
    浏览(37)
  • [OpenCV][C++编程] cv::mat的定义与赋值

    可以通过在/目录下直接搜索opencv,确定opencv所在的目录: lopencv_core 是opencv的核心, -lopencv_highgui包含读取图像和显示图像的函数 -lopencv_imgproc包含图像处理函数(非机器学习方法),例如线性滤波,边缘检测、膨胀腐蚀、检测直线、仿射变换等等。 -lopencv_ml包含机器学习算法

    2024年02月09日
    浏览(48)
  • [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日
    浏览(48)
  • c++ opencv中unsigned char *、Mat、Qimage互相转换

    unsigned char * 转Mat void * 转Qimage qimage转Mat Mat转Qimage

    2024年02月03日
    浏览(62)
  • Opencv C++图像处理:矩阵Mat + 随机数RNG + 计算耗时 + 鼠标事件

    数据类型 字节数 取值范围 bool型(布尔型) 1 [0 or 1] BOOL型(int型) 4 [TRUE or FALSE] sbyte型(有符号8位整数) 1 [128 ~ 127] bytet型(无符号8位整数) 8U 2 [0 ~ 255] short型(有符号16位整数) 16S 2 [-32,768 ~ 32,767] ushort型(无符号16位整数) 16U 2 [0 ~ 65,535] int型(有符号32位整数) 32S 4 [

    2024年02月03日
    浏览(56)
  • 将ncnn及opencv的mat存储成bin文件的方法

    利用fstream,将ncnn及opencv的mat存储成bin文件。 std::ios::binary标志指示文件以二进制模式进行读写, 将input_mat中的宽、高和通道数分别赋值给width、height和channels, 使用file.write函数将width、height和channels的值以二进制形式写入文件。reinterpret_cast用于将指针类型进行类型转换,这里

    2024年02月02日
    浏览(37)
  • 【C++的OpenCV】第十四课-OpenCV基础强化(三):单通道Mat元素的访问之data和step属性

    🎉🎉🎉 欢迎来到小白 p i a o 的学习空间! color{red}{欢迎来到小白piao的学习空间!} 欢迎来到小白 p ia o 的学习空间! 🎉🎉🎉 💖 C++Python所有的入门技术皆在 我的主页 color{#0cc123}{我的主页} 我的主页 :我的主页         通过之前的学习内容我们知道,Mat中的元素在空间

    2024年02月06日
    浏览(45)
  • 【OpenCV】Mat矩阵解析 Mat类赋值,单/双/三通道 Mat赋值

    OpenCV Mat类详解

    2024年02月04日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包