当前位置: 首页 > news >正文

【C++的OpenCV】第四课-OpenCV图像常用操作(一):Mat对象深化学习、灰度、ROI

我们开始图像处理的基本操作的了解

  • 一、图像对象本身的加深学习
    • 1.1 Mat对象和ROI
      • 1.1.1 创建一个明确的Mat对象
      • 1.1.2 感兴趣的区域ROI
  • 二、图像的灰度处理
    • 2.1 概念
    • 2.2 cvtColor()函数
    • 2.3 示例

一、图像对象本身的加深学习

1.1 Mat对象和ROI

    这是一个技术经验的浅尝,所以不是某个具体的函数,而是对前边某部分大家接触过的内容的加深和复习,帮助大家更深地进入视觉处理这个领域的学习。

1.1.1 创建一个明确的Mat对象

  • Mat对象的加深理解

    我们有多种方式从现实世界中获取数字图像:数码相机,扫描仪,计算机断层扫描和磁共振成像等等。在任何情况下,我们(人类)看到的都是图像。然而,当将其转换为数字设备时,我们记录的是图像中每个点的数值。

在这里插入图片描述
    例如在上述图像中,您可以看到汽车的镜像只不过是一个包含像素点所有强度值的矩阵。我们如何获取和存储像素值可能会根据我们的需要而有所不同,但最终,计算机世界内的所有图像可能会被减少到描述矩阵本身的数字矩阵和其他信息。OpenCV是一个计算机视觉库,其主要重点是处理和操纵这些信息。因此,您需要熟悉的第一件事是OpenCV如何存储和处理图像。
    所以可以简单的理解为,图像就是一个n维矩阵

  • Mat对象的构造函数的解读
    原文:Mat对象的多种构造函数原文地址

在这里插入图片描述
其中,我们常用的构造函数,主要有以下几种:
1、Mat (int rows, int cols, int type, const Scalar &s)

  • 参数解释:
//This is an overloaded member function, 
//provided for convenience. 
//It differs from the above function only in what argument(s) it accepts.
// 这是一个为了更加便捷而提供的重载成员函数,
//和上述构造函数的区别仅仅在于所接受的参数个数的不同//Parameters  成员参数:
//rows:	一个2维数组的行数
//cols:	 一个2维数组的列数
//type:	这是一个重要的参数,关于这个参数的值(宏),解释放在下边,大家一定要引起重视://原文:Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices,// or CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.//翻译:该参数表示数组的类型(矩阵的类型),//由CV_8UC1...CV_64FC4来创建1~4通道的矩阵,//或者使用CV_8UC(n), ..., CV_64FC(n)来创建多通道的矩阵。/*CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]其中,The number of bits per item为每个矩阵数字的位数(实则规定十进制数字的大小,这里需要大家对二进制转换10进制比较了解才可);Signed or Unsigned为是否有符号(数据的类型);The channel number为通道的个数Type Prefix为前缀例如:CV_8UC3意味着我们使用8位长的无符号字符类型,每个像素有三个通道。这是最多四个通道号预定义的。*/
//s:	一个用于初始化矩阵元素的初始化的可选值. 旨在在构造之后完成对所有矩阵元素的值设定为特定值的参数, 使用赋值操作来完成这个动作.
  • 备注:其变形cv::Mat::Mat(Size size,int type,const Scalar & s ) 中Size对象也是一种尺寸对象的表达,可以简单理解为长宽高组成的一个Size对象(当然对于复杂图像而言,理解方式没错,但是具体表述得在理解后自行变通)

2、Mat (int ndims, const int *sizes, int type, const Scalar &s)

  • 参数解释:
//ndims:维度
//sizes:是一个整型数组,且数组中的元素不可变,维度是n就有n个元素,//每个元素的大小表示每个维度上的尺寸。
//type: 同上
//s:同上/*例如:int sz[3] = {2,2,2};Mat L(3,sz, CV_8UC(1), Scalar::all(0));这个对象就是一个3维的,每个维度大小为2,且每一个维度8位无符号的图像*/

3、Mat (const Mat &m)

  • 参数解释:
// m:另外一个Mat对象,拷贝构造函数。

4、Mat (const Mat &m, const Rect &roi)

  • 参数解释:
// 这里涉及到一个非常重要的参数:
// roi:感兴趣的区域,其类型为Rect,这个类型的对象就是一个矩形对象(方框)。//当然,感兴趣的区域不一定是方形的(可以是圆的...等),注意融会贯通。

其他的构造函数只要搞懂上边四个,都可以融会贯通。

1.1.2 感兴趣的区域ROI

  • 什么是ROI:(region of intrest)感兴趣的区域,有什么用途?旨在图像上选择自己感兴趣的区域用于其他的操作。是一种灵活的技术。
  • 如何使用?
    其实在上边已经悄悄地给大家演示了一种方式:
// 利用Rect来完成对Mat对象上感兴趣部分的截取:
Mat (const Mat &m, const Rect &roi) // 就是利用这个构造函数即可,其余的方式在后续的实战中慢慢积累,但是基础很重要,了解本质即活学活用了。
  • 关于Rect对象的说明:
    • 原文网址:Rect类的解释
      在这里插入图片描述只需要理解,正方形即可。
  • 示例:
Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle//其中Rect中的参数可以理解为x,y(正方形的起始点坐标【左上顶点】,两个10的含义),正方形区域的长宽(两个100的含义)
Mat E = A(Range::all(), Range(1,3)); // 利用矩阵行列也可以选择矩形区域,用的没有Rect多

二、图像的灰度处理

2.1 概念

  • 什么是灰度处理?
    以RGB色图片为例,使得三通道色相等(R=G=B)的处理手段称之为灰度处理,如果RGB是(0,0,0)为纯黑(0代表没有颜色,即每个通道都是黑的,所以最终是黑色的),如果是(255,255,255)就是白色(最亮)
  • 为什么进行灰度处理?
    一般图像处理默认采用灰度处理,因为彩色处理的难度和计算量非常大,且容易出错还耽误时间,在处理好后再转回彩色即可。

2.2 cvtColor()函数

  • 函数原型:

void cv::cvtColor	(	InputArray 	src,OutputArray 	dst,int 	code,int 	dstCn = 0 )	
  • 函数功能:图像的色彩空间转换格式,不仅仅局限于灰度转换,用途广泛。
  • 参数解释:
    • src : 原始图像
    • dst :处理后的图像
    • code :色彩空间的转换模式
    • dstCn :目标图像的通道数,默认为0(不改变不需要设置该值),如果是0表示自动沿用src的通道数
  • 关于code参数值的说明:其决定了色彩转换的模式,方式非常多,附原网址供参考:code参数值列表
    在这里插入图片描述红色框选的为将BGR图像进行灰度转换的参数,以下类似,大家根据实际情况进行选择即可。

2.3 示例

Mat img = imread("image.jpg");
Mat grey;
cvtColor(img, grey, COLOR_BGR2GRAY);
namedWindow("image", WINDOW_AUTOSIZE);
imshow("image", grey);
waitKey();

后续,我们继续学习。持续更新。

相关文章:

【C++的OpenCV】第四课-OpenCV图像常用操作(一):Mat对象深化学习、灰度、ROI

我们开始图像处理的基本操作的了解一、图像对象本身的加深学习1.1 Mat对象和ROI1.1.1 创建一个明确的Mat对象1.1.2 感兴趣的区域ROI二、图像的灰度处理2.1 概念2.2 cvtColor()函数2.3 示例一、图像对象本身的加深学习 1.1 Mat对象和ROI 这是一个技术经验的浅尝,所以…...

Propargyl-PEG1-SS-PEG1-PFP ester,1817735-30-0,炔基应用于生物标记

【中文名称】丙炔-单乙二醇-二硫键-单乙二醇-五氟苯酚酯【英文名称】 Propargyl-PEG1-SS-PEG1-PFP ester【结 构 式】【CAS号】1817735-30-0【分子式】C16H15F5O4S2【分子量】430.4【基团部分】炔基基团【纯度标准】95%【包装规格】1g,5g,10g&#xff0c…...

产品运营︱用户活跃度低的解决方法

app用户活跃度低,产品拉新变现效率慢,这是运营app时难免会遇到的情况。要想解决这类问题,就要从可能的原因下手,进行产品的优化改进,记录下改变后的关键数据变化,定期做好复盘工作进行调整。 一、app用户量…...

【华为OD机试模拟题】用 C++ 实现 - 求最大数字

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

吉卜力风格水彩画怎么画?

著名的水彩艺术家陈坚曾说:“水彩是用水润调和形成的饱和度极高的艺术画面,在纸上晕染的画面面积、强度等具有许多随意性,天空的颜色乌云密布,都是很随意的,难以模仿。” 是的,水彩画的妙处就在于不确定的…...

Python的类变量和对象变量声明解析

Python的类变量和对象变量声明解析 原文链接:https://www.cnblogs.com/bwangel23/p/4330268.html Python的类和C一样,也都是存在两种类型的变量,类变量和对象变量!前者由类拥有,被所有对象共享,后者由每个…...

#笨鸟先飞 猴博士电路笔记 第一篇 电路基础

第零课 基础知识串联与并联电源电势与电位差第一课 电阻电路的等效变换电压源串联电流源并联电压源和电流源串联电压源和电流源并联电压源转化为电流源电流源转化为电压源Δ-Y等效变换第二课 基尔霍夫定律基尔霍夫电流定律任一结点上流出电流之和等于流入电流之和。受控电流源&…...

快捷式~node.js环境搭建

1、安装包官网下载:Node.js (nodejs.org) 2、安装完成后修改环境变量 在上面已经完成了 node.js 的安装,即使不进行此步骤的环境变量配置也不影响node.js的使用 但是,若不进行环境变量配置,那么在使用命令安装 node.js全局模块 …...

ZooKeeper实现分布式队列、分布式锁和选举详解

提示:本文章非原创,记录一下优秀的干货。 [原创参考]:https://blog.csdn.net/qq_40378034/article/details/117014648 前言 ZooKeeper源码的zookeeper-recipes目录下提供了分布式队列、分布式锁和选举的实现GitHub地址。 本文主要对这几种实…...

【swift】swift quick start

一、常量和变量 常量let,变量var 也可以用于确定数组和字典的不可变和可变 二、数据类型: Int:整数类型,可表示有符号整数或无符号整数,分别使用Int和UInt表示。 Float:单精度浮点数类型,用于…...

浅谈volatile关键字

文章目录1.保证内存可见性2.可见性验证3.原子性验证4.原子性问题解决5.禁止指令重排序6.JMM谈谈你的理解6.1.基本概念6.2.JMM同步规定6.2.1.可见性6.2.2.原子性6.2.3.有序性6.3.Volatile针对指令重排做了啥7.你在哪些地方用过Volatile?volatile是Java提供的轻量级的…...

10 种 Spring事务失效场景

10 种 Spring事务失效场景 1.概述 Spring针对Java Transaction API (JTA)、JDBC、Hibernate和Java Persistence API(JPA)等事务 API,实现了一致的编程模型,而Spring的声明式事务功能更是提供了极其方便的事务配置方式,配合Spring Boot的自动…...

重读《DOOM启世录》

许多游戏开发者都是网瘾少年,抱着对游戏的热爱进入游戏行业,在经历996的加班加点,买房的压力,浮躁同样跟随着我们,我们是否还热爱着自己的事业,我们不是天才,也成不了卡马克,但是我们…...

巧用性格上的差异来组建团队

你好,我是得物 App 交易平台及中间件平台的 Team Leader Alan。 组建团队过程中,你有没有遇到过类似的场景:团队中某些人之间总是互相不对付、气场不合,不管是日常沟通中还是方案对齐,总是会出现面红耳赤的场面。 从…...

Leetcode11. 盛最多水的容器

一、题目描述: 给定一个长度为 nnn 的整数数组 heightheightheight 。有 nnn 条垂线,第 iii 条线的两个端点是 (i,0)(i, 0)(i,0) 和 (i,height[i])(i, height[i])(i,height[i]) 。 找出其中的两条线,使得它们与 xxx 轴共同构成的容器可以容…...

Java笔记026-集合/数组、Collection接口、ArrayList、Vector、LinkedList

集合集合的理解和好处保存多个数据使用的是数组,分析数组的弊端数组1、长度开始必须指定,而且一旦指定,不能更改2、保存的必须为同一类型的元素3、使用数组进行增加/删除元素的示意代码-比较麻烦Person数组扩容示意代码Person[] pers new Pe…...

Hive学习——分桶抽样、侧视图与炸裂函数搭配、hive实现WordCount

目录 一、分桶抽样 1.抽取表中10%的数据 2.抽取表中30%的数据 3.取第一行 4.取第10行 5.数据块抽样 6.tablesample详解 二、UDTF——表生成函数 1.explode()——炸裂函数 2.posexpolde()——只能对array进行炸裂 3.inline()——炸裂结构体数组 三、UDTF与侧视图的搭…...

大数据算法

1. TOP K 算法 有10个⽂件,每个⽂件1G,每个⽂件的每⼀⾏存放的都是⽤户的 query,每个⽂件的 query 都可能重复。要求你按照 query 的频度排序。 方法1: 顺序读取10个⽂件,按照 hash(query)%10 的结果将 query 写⼊到…...

非暴力沟通读书笔记

浅读《非暴力沟通》,本书对于沟通的方式总结成了一个方法论,从13个章节去概述非暴力沟通的方法和重点。其中最重要的是非暴力沟通四要素,观察、感受、需要、请求。同时在沟通中注意观察,投入爱,重视倾听的力量&#xf…...

代码随想录【Day21】| 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

530. 二叉搜索树的最小绝对差 题目链接 题目描述: 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 示例: 提示:树中至少有 2 个节点。 难点: 解答错误!仅考虑了…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...