OpenCV Mat类简介,Mat对象创建与赋值 C++实现

news2024/9/23 17:25:09

在 C++ 中,OpenCV 提供了一个强大的类 Mat 来表示图像和多维矩阵。Mat 类是 OpenCV 中最基础和最常用的类,用于存储和操作图像数据。

文章目录

    • Mat类简介
      • Mat 类的定义
      • Mat 类的构造函数
    • 代码示例
      • 深拷贝示例
      • 赋值示例
      • 浅拷贝示例

Mat类简介

Mat 类是一个多维的、通用的、压缩的数组容器,主要用于表示图像、点集、特征向量、矩阵等数据。Mat 的底层数据存储采用连续内存块,可以高效地进行矩阵操作和图像处理。

Mat 类的定义

class CV_EXPORTS Mat {
public:
    // 默认构造函数
    Mat();

    // 构造函数
    Mat(int rows, int cols, int type);
    Mat(Size size, int type);
    Mat(int rows, int cols, int type, const Scalar& s);
    Mat(Size size, int type, const Scalar& s);

    // 拷贝构造函数
    Mat(const Mat& m);

    // 赋值操作符
    Mat& operator = (const Mat& m);

    // 其他成员函数...

    // 数据访问
    uchar* data;
    int rows, cols;
    // 其他成员变量...
};

Mat 类的构造函数

默认构造函数

Mat();

创建一个空的 Mat 对象。

指定尺寸和类型的构造函数

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

创建一个指定尺寸和类型的 Mat 对象。type 参数指定了矩阵元素的类型,例如 CV_8UC1 表示单通道 8 位无符号整型,CV_8UC3 表示三通道 8 位无符号整型。

拷贝构造函数

cpp
复制代码
Mat(const Mat& m);

创建一个 Mat 对象,并复制另一个 Mat 对象的数据。

代码示例

深拷贝示例

Mat dst1,dst2;
dst1 = image.clone();
image.copyTo(dst2);

此时dst1,dst2 都是拷贝了image指向的数据。image的数据改变,dst1,dst2都不会随之改变

赋值示例

  // 创建空白图像 创建一个8*8的全为0的矩阵, 矩阵的宽度 等于 8*通道数 ,这里的通道数为1 ,一般代表为灰度图
    Mat dst3 = Mat::zeros(Size(8,8),CV_8UC(1));
//    cout<<dst3<<endl;
    cout<<"dst width :"<<dst3.cols<<" dst height :"<<dst3.rows<<" dst3 channel :"<<dst3.channels()<<endl;
    // 创建空白图像 创建一个4*4的全为1的矩阵, 矩阵的宽度 等于 4 *通道数 ,这里的通道数为3,一般代表为彩色图
    Mat dst4 = Mat::ones(Size(4,4),CV_8UC(3));
    // ones 用的时候要小心, 他不会把全部数据初始化为1,只会把第一个通道的函数初始化为1,其余通道为0
    cout<<dst4<<endl;
    cout<<"dst4 width :"<<dst4.cols<<" dst4 height :"<<dst4.rows<<" dst4 channel :"<<dst4.channels()<<endl;

    dst3= 15;  //也可以直接赋值 ,这样会直接给第一个通道值全赋值为15
    cout<<dst3<<endl;
    cout<<"dst3 width :"<<dst3.cols<<" dst3 height :"<<dst3.rows<<" dst3 channel :"<<dst3.channels()<<endl;

CV_8UC1 详解

  • CV: OpenCV 定义的前缀,表示这是一个 OpenCV 的类型。
  • 8U: 表示每个元素是 8 位无符号整型(8-bit Unsigned)。
  • C1: 表示图像有一个通道(1 Channel)。

因此,CV_8UC1 表示一个具有单通道的 8 位无符号整型图像。每个像素点用一个 8 位的值表示,范围是 0 到 255,通常用于表示灰度图像。同理CV_8UC3 表示一个具有三个通道的 8 位无符号整型图像。每个像素点由三个 8 位值组成,通常用于表示彩色图像。C3代表三个通道。

Mat重载了输出,因此可以直接打印

在这里插入图片描述

  //创建512*512的图像, 具有三个通道,并给第一个通道赋值为1.
    Mat dst5 = Mat::ones(Size(512,512),CV_8UC(3));
    //使用Scalar可以创建多维通道
    dst5 = Scalar(255,0,0);

Scalar函数详解

在 OpenCV 中,Scalar 是一个常用的数据结构,用于表示一个包含四个元素的向量,通常用于定义颜色和其他多通道数据。Scalar 函数主要用于图像处理和计算机视觉中的各种操作,例如设置绘图颜色、定义阈值范围等。

  1. 基本概念

Scalar 是一个包含四个元素的向量,通常用于表示颜色(BGR 或者 BGRA)或者其他多通道数据。在 OpenCV 中,Scalar 的定义如下:

Scalar(double v0, double v1=0, double v2=0, double v3=0)
  1. 构造函数参数
  • v0:第一个元素的值(例如蓝色通道的值)。
  • v1:第二个元素的值(例如绿色通道的值,默认值为 0)。
  • v2:第三个元素的值(例如红色通道的值,默认值为 0)。
  • v3:第四个元素的值(例如 Alpha 通道的值,默认值为 0)。
  1. 常用方法
  • Scalar():默认构造函数,初始化所有元素为 0。
  • Scalar(double v0, double v1, double v2, double v3):初始化四个元素的构造函数。
  • val[i]:访问第 i 个元素的值(i 的范围是 0 到 3)。
  1. 常用场景
  • 定义颜色:在绘图函数中使用,例如 cv2.line()cv2.rectangle()cv2.circle() 等。
  • 阈值处理:用于定义阈值范围,例如 cv2.inRange()
  • 图像初始化:用于初始化图像中的所有像素值。

例如 dst5 = Scalar(255,0,0); 因为OpenCV默认为BGR 蓝色优先,显示这个图像的话,就会是纯蓝色

在这里插入图片描述

浅拷贝示例

   //创建512*512的图像, 具有三个通道,并给第一个通道赋值为1.
    Mat dst5 = Mat::ones(Size(512,512),CV_8UC(3));
    //使用Scalar可以创建多维通道
    dst5 = Scalar(255,0,0);
    show_image(dst5);
    // 浅拷贝示例, dst6 会随着 dst5 变化而变化
    Mat dst6 =dst5;
    dst5 = Scalar(255,255,0);
    imshow("dst5",dst5);
    imshow("dst6",dst6);
    waitKey(0);

此时,dst5 和dst6都是指向了相同的内存区域,因此,dst6也会随着dst5变化而变化。如下图所示,dst5的值改变了,dst6的值也跟着改变

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1938273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel 简介熔断降级什么是熔断什么是降级相同点不同点 整合Sentinel自定义sentinel流控返回数据使用Sentinel来保护feign远程调用自定义资源给网关整合Sentinel参考 简介 熔断降…

ChatGPT实战100例 - (20) 如何玩转影刀RPA

文章目录 ChatGPT实战100例 - (20) 如何玩转影刀RPA背景需求需求分析与流程设计一、需求收集二、流程梳理三、可行性分析流程设计(详细步骤)具体步骤的影刀RPA实现流程图总结AIGC在影刀RPA中的使用总结其他RPA步骤中可能用到AIGC的地方展望总结ChatGPT实战100例 - (20) 如何玩…

EasyExcel相关

1. easyexcel–100M EasyExcel是一个基于Java的使用简单、节省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 节省内存的原因&#xff1a;在解析Excel时没有将文件数据一次性全部加载到内存中&#xff0c;而是从磁盘上一行行读取数据&#xff0c…

深度学习之基础知识整理

现在大语言模型很火&#xff0c;但它的基础仍然是以神经网络为基础的深度学习&#xff0c;不懂神经网络&#xff0c;不了解深度学习&#xff0c;对于大语言模型的二次开发也是整不明白。 那到底需要了解哪些知识&#xff1f;才能看懂深度学习/神经网络的基础模型&#xff0c;想…

后端传递中文到前端 乱码问题

后端代码 前端 乱码 decodeURI(name);使用这个方法,这个方法应该是jquery中的方法 这样就不乱码了

Pointnet++改进即插即用系列:全网首发WTConv2d大接受域的小波卷积|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入WTConv2d,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理…

JVM:垃圾回收器演进

文章目录 一、演进二、Shenandoah三、ZGC 一、演进 二、Shenandoah Shenandoah是由Red Hat开发的一款低延迟的垃圾收集器&#xff0c;Shenandoah并发执行大部分GC工作&#xff0c;包括并发的整理&#xff0c;堆大小对STW的时间基本没有影响。 三、ZGC ZGC是一种可扩展的低延…

MySQL数据库基本用法

了解数据库基本概念 什么是数据库&#xff1f; • 长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个数据“仓库” MySQL数据库的特点 • 开源免费&#xff0c;小巧但功能齐全 • 可在Windows和Linux系统上运行 • 操作方便&#xff0c;…

VS2019安装MFC组件

VS2019支持的MFC版本是mfc140 ~ mfc142版本&#xff0c;它兼容VS2015、VS2017之前的老版本程序。 一、MFC的历史版本 MFC的历史版本如下&#xff1a; IDE发布时间工具集版本MSC_VERMSVCMFC版本dllVisual C6.01998V601200MSVC6.06.0mfc42.dll、mfcce400.dllVisual Studio 2002…

记录解决springboot项目上传图片到本地,在html里不能回显的问题

项目场景&#xff1a; 项目场景&#xff1a;在我的博客系统里&#xff1a;有个相册模块&#xff1a;需要把图片上传到项目里&#xff0c;在html页面上显示 解决方案 1.建一个文件夹 例如在windows系统下。可以在项目根目录下建个photos文件夹&#xff0c;把上传的图片文件…

[经验] 驰这个汉字的拼音是什么 #学习方法#其他#媒体

驰这个汉字的拼音是什么 驰&#xff0c;是一个常见的汉字&#xff0c;其拼音为“ch”&#xff0c;音调为第四声。它既可以表示动词&#xff0c;也可以表示形容词或副词&#xff0c;意义广泛&#xff0c;经常出现在生活和工作中。下面就让我们一起来了解一下“驰”的含义和用法。…

WSL2 Centos7 Docker服务启动失败怎么办?

wsl 安装的CentOS7镜像,安装了Docker之后,发现用systemctl start docker 无法将docker启动起来。 解决办法 1、编辑文件 vim /usr/lib/systemd/system/docker.service将13行注释掉,然后在下面新增14行的内容。然后保存退出。 2、再次验证 可以发现,我们已经可以正常通过s…

C++笔试练习笔记【3】:Fibonacci数列 WY22

文章目录 Fibonacci数列分析题目代码实现 Fibonacci数列 分析题目 首先我们可以通过三个变量进行移动来形成Fibonacci数列 其次我们通过最前面的变量与N进行比较从而固定数列 之后N和左右两个变量做差取最小值即可 代码实现 #include <iostream> using namespace std;…

pcdn技术如何降低网络延迟

PCDN技术通过以下方式降低网络延迟: 1.动态调度与负载均衡: PCDN通过在CDN的边缘节点上部署代理服务器&#xff0c;能够动态地调度和传输内容。当用户请求内容时&#xff0c; PCDN会根据各个节点的负载情况、距离、传输速度等因素来动态选择最优的节点来提供内容。这种动态调…

大语言模型-文本检索任务基准 BEIR

BEIR (A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models) 文本检索任务的基准&#xff0c;使用18 个数据集为检索系统的零样本评估提出了一个标准化基准&#xff0c; BEIR 基准上在9个不同领域的检索任务评估 10 种不同的检索方法。 九个…

剪画小程序:刷到好听的音频怎么将音频保存到手机里

在这个短视频盛行的时代&#xff0c;相信很多朋友都和我一样&#xff0c;常常会被那些精彩视频中的背景音乐深深吸引。 比如我&#xff0c;特别喜欢听歌&#xff0c;这段时间在短视频平台上刷到了好多好看的视频&#xff0c;里面的背景音乐简直绝绝子&#xff01; 那么&#x…

【Linux网络】epoll模型构建Reactor_Tcp服务器{协议/客户端/bind/智能指针}

文章目录 1.std::enable_shared_from_this<TcpServer>2.std::bind3.std::make_shared4.std::shared_ptrstd::shared_ptr 和 std::weak_ptr配合使用 5.剖析代码6.整体代码Calculator.hppClientCal.ccCMakeLists.txtCommon.hppEpoller.hppLog.hppMain.ccnocopy.hppProtocol…

RHCSA —— 第八节 (编辑器、编辑命令等)

Vi/vim编辑器 vim 编辑器 就是相当于在windows中创建一个记事本&#xff0c;一个word文档里面进行编辑所需要的内容。在linux中编辑文本文件&#xff0c;包括但不限于编辑源代码、配置文件、日志文件等文件内容。 三种模式 这是在编辑器中存在三种模式&#xff1a;命令模式、…

Linux 13:网络编程1

1. 预备知识 1-1. 理解源IP地址和目的IP地址 在IP数据包头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址&#xff0c;和目的IP地址。 我们光有IP地址就可以完成通信了嘛&#xff1f;想象一下发qq消息的例子&#xff0c;有了IP地址能够把消息发送到对方的…

LeYOLO, New Scalable and Efficient CNN Architecture for Object Detection

LeYOLO, New Scalable and Efficient CNN Architecture for Object Detection 论文链接&#xff1a;http://arxiv.org/abs/2406.14239 代码链接&#xff1a;https://github.com/LilianHollard/LeYOLO 一、介绍 本文关注基于FLOP的高效目标检测计算的神经网络架构设计选择&am…