【OpenCV】 基础入门(一)初识 Mat 类 | 通过 Mat 类显示图像

news2024/11/26 0:56:28
  • 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
  • 💟 作    者:锡兰_CC ❣️
  • 📝 专    栏:【OpenCV • c++】计算机视觉
  • 🌈 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力💪💪💪

文章目录

    • 前言
    • 一、什么是 Mat 类
    • 二、Mat 类的常见构造方式
    • 三、读取图像并显示保存
      • 1、读取图像
      • 2、显示图像
      • 3、存储图像
    • 四、代码演示

前言

  在计算器内存中,数字图像是以矩阵的形式保存的,矩阵信息中包含了所有像素点的强度值,如何获取并储存这些像素值可根据实际场景应用来确定。在计算机处理中所有图像信息都将转化为数值信息矩阵。
  OpenCV作为计算机视觉处理库,其主要目的就是通过处理和操作这些矩阵信息来获得更加高级的信息。在处理图像中,我们通常使用OpenCV中最基础的库类Mat类来对图像进行操作。

一、什么是 Mat 类

  Mat类由矩阵头和指向存储所有像素值的矩阵的指针构成。Mat类表示一个n维的密集数值单通道或多通道数据,它可以用于储存实数或负数值的向量和矩阵,灰度或彩色图像,体素,向量场,点云,张量,直方图等。
矩阵头包含矩阵的尺寸、存储方法、地址和引用次数。矩阵头是一个常数,绝大数情况下,矩阵头的大小远小于矩阵数据量的大小。
Mat类如下所示:

class CV_EXPORTS Mat {
	public :
		int flags;			//标志位
		int dims;			//数组的维数 >= 2 
		int rows,cols;		//行和列的数量 
		uchar *data;  		//指向数据的指针
		int * refcount;  	//指针的引用计数器,当阵列指向用户分配的数据时指针为 NULL 
}; 

二、Mat 类的常见构造方式

  构造mat类相当于构造了一个矩阵(数组),一般需要四个基本要素,行数(高),列数(宽),通道数以及数据类型。
  Mat 类常见的的构造方式如下:

  1. Mat :: Mat()
    //无参数构造方法
  2. Mat :: Mat(int rows,int cols,int type)
    //创建行数为 rows,列数为 cols,类型为type 的图像
  3. Mat :: Mat(Size size, int type)
    //创建大小为 size,类型为 type 的图像
  4. Mat :: Mat(int rows,int cols,int type,const Scalar& s);
    //创建行数为 rows,列数为 cols,类型为type 的图像,并将所有元素初始化为 s
  5. Mat :: Mat(Size size, int type,const Scalar& s)
    //创建大小为 size,类型为 type 的图像,并将所有元素初始化为 s
  6. Mat :: Mat(const Mat& m)
    //将 m 赋值给新的对象,m 和新对象共用图像数据。

三、读取图像并显示保存

1、读取图像

  OpenCV使用函数imread来读取图像。

void cv::imread(const String &filename, OutputArray dst, int flags = IMREAD_COLOR) 	

  其中,参数filename表示读取文件的地址,dst表示将在其中加载图像的对象。flags表示读取图像的颜色类型,默认为1。

2、显示图像

  OpenCV使用函数imshow来读取图像。

void cv::imshow(const String &winname, InputArray mat) 	

  其中,参数winname表示突破窗口的名字, mat表示显示图像。

  在使用函数imshow之后应调用cv::waitKey,否则,它将不会显示图像。例如,waitKey(0) 将无限显示窗口,直到按下任何一个键(适用于图像显示)。waitKey(25) 将显示一帧并等待大约25ms的按键(适合逐帧显示视频)。要关闭该窗口,可以使用cv::destroyWindow()。

3、存储图像

  OpenCV使用函数imwrite来读取图像。

 bool cv::imwrite(const String & filename, InputArray img, const std::vector<int> & params = std::vector<int>()) 	

  其中,参数filename表示写入文件的格式以及文件拓展名,img表示待写入图像,params表示文件格式信息。

四、代码演示

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>
using namespace cv;
using namespace std;
int main() {
	Mat srcImage = imread("..\\cc.jpg");
	if (!srcImage.data)
		return 1;
	imshow("srcImage", srcImage);
	imwrite("cc.png", srcImage);
	waitKey(0);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

其他

更多专栏订阅推荐:

  • 👍 【开卷数据结构】
  • 💛 【备战蓝桥,冲击省一】
  • 💕   从零开始的 c++ 之旅
  • 💖 【OpenCV • c++】计算机视觉

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

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

相关文章

OR-352,兼容替代TLP187/TLP127/EL452等,达灵顿光耦

低输入正向电流 高电流传输比 DC和AC输入 电平转换 高输入输出隔离电压和高集电极发射极电压 特征 电流传输比&#xff08;IF 1mA&#xff0c;VCE 2V时&#xff0c;CTR &#xff1a; 最小1000%&#xff09; 高集电极-发射极电压 &#xff08;VCEO 300V&#xff09; …

mongodb的简单操作

文章目录 前言数据库的创建和删除集合的创建和删除文档的插入和查询异常处理更新数据局部修改符合条件的批量更新加操作 删除文档删除全部数据删除符合条件的数据 统计count统计有多少条数据统计特定条件有多少条数据 分页查询排序查询正则查询比较查询包含查询条件连接查询索引…

Python疑难杂症(16)---Numpy知识集合(四)列出Numpy模块的常用函数,供查询参考。

列出Numpy模块的常用函数&#xff0c;供查询参考。 numpy.array:创建新的NumPy数组 numpy.zeros:创建一个以零填充的数组。 numpy.random:生成随机数组的函数。 numpy.linspace:在指定范围内生成均匀间隔的数字。 numpy.range:用间隔的值创建数组。 numpy.shape:返回一个…

AWS-EKS 给其他IAM赋予集群管理权限

AWS EKS 设计了权限管理系统&#xff0c;A用户创建的集群 B用户是看不到并且不能管理和使用kubectl的&#xff0c;所以我们需要共同管理集群时就需要操场共享集群访问给其他IAM用户。 两种方式添加集群控制权限&#xff08;前提&#xff1a;使用有管理权限的用户操作&#xff…

睡岗检测识别系统

智驱力睡岗检测识别系统是一种基于人工智能技术的监控系统&#xff0c;旨在通过视频分析来识别和报警那些在工作岗位上出现睡觉行为的人员。这种系统通常应用于需要24小时监控的关键岗位&#xff0c;如银行、营业厅、监控中心等场所。系统能够自动分析监控画面&#xff0c;当检…

如何在比特币上验证ZK Proofs

1. 引言 前序博客有&#xff1a; 基于BitVM的乐观 BTC bridgeBitVM&#xff1a;Bitcoin的链下合约Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM2&#xff1a;比特币上的无需许可验证以比特币脚本来实现SNARK VerifierClementine&#xff1a;Citrea的基于BitVM的…

鸿蒙HarmonyOS应用开发之NativeBundle开发指导

场景介绍 开发者可以通过本指导了解在OpenHarmony应用中&#xff0c;如何使用Native Bundle接口获取应用自身相关信息。 接口说明 开发步骤 1. 创建工程 2. 添加依赖 创建完成后&#xff0c;IDE会在工程生成cpp目录&#xff0c;目录有libentry/index.d.ts、hello.cpp、CMak…

XenCenter 2024 导入虚拟机

导入虚拟机 虚拟机位置 导入到那一个服务器 导入虚拟机存放存储位置 虚拟机网卡配置 SR修复功能&#xff0c;看自己需求 虚拟机恢复确认最终配置 恢复好的虚拟机 虚拟机模板转换

上位机图像处理和嵌入式模块部署(qmacvisual图像清晰度)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 做过isp的同学都知道&#xff0c;图像处理里面有一个3A&#xff0c;即自动曝光、自动白平衡和自动对焦。其中自动对焦这个&#xff0c;就需要用输入…

HbnnMall电子商城系统介绍(功能与技术栈)

今天在看自己网站上的文章时&#xff0c;看到了曾经开发的电商系统。那是在2020年&#xff0c;来到小米两年后&#xff0c;我已经对各个业务线&#xff0c;各种专业知识有了系统性的了解和学习&#xff0c;所以想自己动手写一个电商系统&#xff0c;以便进一步提高自己的技术。…

【数论】莫比乌斯反演(欧拉反演)进阶-杜教筛

文章目录 前言 回忆 题集12 杜教筛例题 前言 这里需要对莫反有一些基础。 不会的可以点这里 回忆 f ( n ) ∑ d ∣ n g ( d ) → g ( n ) ∑ d ∣ n f ( d ) μ ( n d ) f(n)\sum_{d|n}g(d)\rightarrow g(n)\sum_{d|n}f(d)\mu(\frac{n}{d}) f(n)∑d∣n​g(d)→g(n)∑d∣n​…

vue3+eachrts饼图轮流切换显示高亮数据

<template><div class"charts-box"><div class"charts-instance" ref"chartRef"></div>// 自定义legend 样式<div class"charts-note"><span v-for"(items, index) in data.dataList" cla…

unity之 “Allow ‘unsafe‘ code“ 在哪里。

导入unity中的代码&#xff0c;出现如下错误&#xff0c;该如何解决&#xff1f; Unsafe code may only appear if compiling with /unsafe. Enable "Allow unsafe code" in Player Settings to fix this error 解决这个问题&#xff0c;只需要设置就可以。 设置的地…

【苍穹外卖】log爆红

使用了Slf4j注解&#xff0c;用于自动生成一个log对象&#xff0c;相当于private final Logger log LoggerFactory.getLogger(当前类名.class); 这个注解需要安装Lombok插件才能使用。 IDEA file—settings–plugins&#xff0c;搜索lombok–install。安装完后自动重启IDEA后…

【WEEK6】 【DAY2】DQL Data Querying - Part Two 【English Version】

2024.4.2 Tuesday Following the previous article 【WEEK6】 【DAY1】DQL Data Query - Part One【English Version】 Contents 4.4. Join Queries4.4.1. JOIN Comparison4.4.2. Seven Types of JOINs4.4.3. Examples4.4.3.1. In this example, the results of INNER JOIN and…

DLL导出API注意事项

文章目录 问题原则示例一解决方案 示例二解决方法 参考 问题 在 windows 平台下&#xff0c;如果在动态库的接口中使用 std::string 或其它 std 容器&#xff0c;会导致崩溃或其它内存问题&#xff0c;所以一般要求动态库的接口必须是 C 语言实现。 原则 一个原则&#xff1a;…

LabVIEW专栏二、调用子VI

该节目标是创建带子vi&#xff0c;修改vi属性&#xff0c;测试可重入和不可重入的区别 一 、设置子VI 把VI封装成为子VI&#xff0c;可以帮助模块化程序&#xff0c;简化代码结构。 任何VI本身都可以成为别的VI的子VI。 1.1、设置输入输出端子 1、在前面板空白处&#xff0…

JavaScript中什么叫深拷贝?

在 JavaScript 中&#xff0c;深拷贝指的是创建一个新的对象&#xff0c;这个新的对象与原始对象完全独立&#xff0c;没有任何共享的属性或者数据&#xff0c;它们不共享同一块内存地址。深拷贝会复制原始对象的所有属性和嵌套对象的所有属性&#xff0c;包括嵌套对象中的属性…

Mybatis——查询数据

查询操作 根据用户id查询单条记录&#xff0c;在映射器接口(UserMapper)中定义如下方法&#xff1a; package org.example.mapper;import org.example.demo.User;import java.util.List;public interface UserMapper {//根据id查询UserUser selectUserById(Integer userId); …

使用 RisingWave、NATS JetStream 和 Superset 进行实时物联网监控

在物联网&#xff08;IoT&#xff09;背景下&#xff0c;处理实时数据会遇到一些特定的障碍&#xff0c;如边缘计算资源不足、网络条件限制、扩展性存在问题、设备间有多样性差异。要克服这些挑战&#xff0c;需要高效的边缘计算技术、强大的安全措施、标准化协议、可扩展的管理…