Python OpenCV 计算机视觉:6~7
原文:OpenCV Computer Vision with Python
协议:CC BY-NC-SA 4.0
译者:飞龙
本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。
当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。
附录 A:与 Pygame 集成
本附录显示了如何在 OpenCV 应用中设置 Pygame 库以及如何使用 Pygame 进行窗口管理。 此外,附录还概述了 Pygame 的其他功能以及一些学习 Pygame 的资源。
注意
本章的所有完成代码都可以从我的网站下载。
安装 Pygame
假设我们已经根据第 1 章,“设置 OpenCV”中描述的方法之一设置了 Python。 根据我们现有的设置,我们可以通过以下方式之一安装 Pygame:
-
带有 32 位 Python 的 Windows:从以下位置下载并安装 Pygame 1.9.1。
-
带有 64 位 Python 的 Windows:从以下位置下载并安装 Pygame 1.9.2 预览版。
-
带有 Macports 的 Mac:打开“终端”并运行以下命令:
$ sudo port install py27-game
-
带有 Homebrew 的 Mac:打开终端并运行以下命令来安装 Pygame 的依赖项,然后安装 Pygame 本身
$ brew install sdl sdl_image sdl_mixer sdl_ttf smpeg portmidi $ /usr/local/share/python/pip install \ > hg+http://bitbucket.org/pygame/pygame
-
Ubuntu 及其衍生版本:打开“终端”并运行以下命令:
$ sudo apt-get install python-pygame
-
其他类似 Unix 的系统:Pygame 在许多系统的标准存储库中可用。 典型的包名称包括
pygame
,pygame27
,py-game
,py27-game
,python-pygame,
和python27-pygame
.。
现在,Pygame 应该可以使用了。
文档和教程
Pygame 的 API 文档和一些教程可以在以下网址在线找到。
Al Sweigart 的《使用 Python 和 Pygame 制作游戏》是一本烹饪手册,用于在 Pygame 1.9.1 \中重新创建几个经典游戏。 免费的电子版本可从以下网站在线获得。或在以下网站下载 PDF 文件。
派生Manager.WindowManager
如第 2 章,“处理照相机,文件和 GUI”中所述,我们的面向对象设计使我们可以轻松地将 OpenCV 的 HighGUI 窗口管理器切换为另一个窗口管理器,例如 Pygame。 为此,我们只需要继承我们的managers.WindowManager
类的子类,并覆盖四个方法:createWindow()
,show()
,destroyWindow()
和processEvents()
。 另外,我们需要导入一些新的依赖项。
要继续,我们需要第 2 章“处理照相机,文件和 GUI”中的managers.py
文件,和第 4 章“用 Haar 级联跟踪人脸”中的utils.py
文件。 在utils.py
中,我们只需要一个函数isGray()
,我们在第 4 章,“用 Haar 级联跟踪人脸”中实现。 让我们编辑managers.py
以添加以下导入:
import pygame
import utils
同样在managers.py
中,在执行WindowManager
之后的某个位置,我们想添加名为PygameWindowManager
的新子类:
class PygameWindowManager(WindowManager):def createWindow(self):pygame.display.init()pygame.display.set_caption(self._windowName)self._isWindowCreated = Truedef show(self, frame):# Find the frame's dimensions in (w, h) format.frameSize = frame.shape[1::-1]# Convert the frame to RGB, which Pygame requires.if utils.isGray(frame):conversionType = cv2.COLOR_GRAY2RGBelse:conversionType = cv2.COLOR_BGR2RGBrgbFrame = cv2.cvtColor(frame, conversionType)# Convert the frame to Pygame's Surface type.pygameFrame = pygame.image.frombuffer(rgbFrame.tostring(), frameSize, 'RGB')# Resize the window to match the frame.displaySurface = pygame.display.set_mode(frameSize)# Blit and display the frame.displaySurface.blit(pygameFrame, (0, 0))pygame.display.flip()def destroyWindow(self):pygame.display.quit()self._isWindowCreated = Falsedef processEvents(self):for event in pygame.event.get():if event.type == pygame.KEYDOWN and \self.keypressCallback is not None:self.keypressCallback(event.key)elif event.type == pygame.QUIT:self.destroyWindow()return
注意,我们使用了两个 Pygame 模块:pygame.display
和pygame.event
。
调用pygame.display.init()
创建一个窗口,调用pygame.display.quit()
销毁一个窗口。 重复调用display.init()
无效,因为 Pygame 仅适用于单窗口应用。 Pygame 窗口的绘图表面类型为pygame.Surface
。 为了获得对该Surface
的引用,我们可以调用pygame.display.get_surface()
或pygame.display.set_mode()
。 后一个函数在返回实体之前修改Surface
实体的属性。 一个Surface
实体具有一个blit()
方法,该方法将另一个Surface
和一个坐标对作为参数,其中后一个Surface
应被“变白”(绘制)到第一个上。 完成当前帧的窗口Surface
的更新后,我们应该通过调用pygame.display.flip()
来显示它。
通过调用pygame.event.get()
可以轮询诸如keypresses
之类的事件,该函数将返回自上次调用以来发生的所有事件的列表。 每个事件的类型均为pygame.event.Event
,并具有属性 type,它指示事件的类别,例如pygame.KEYDOWN
表示按键,pygame.QUIT 表示窗口的关闭按钮被点击。 取决于type
的值,Event
实体可能具有其他属性,例如,KEYDOWN
事件的key
(ASCII 键代码)。
相对于使用 HighGUI 的基本WindowManager
而言,PygameWindowManager
通过在每帧 OpenCV 的图像格式和 Pygame 的Surface
格式之间进行转换而产生一些间接费用。 但是,PygameWindowManager
提供正常的窗口关闭行为,而基础WindowManager
不提供。
修改应用
让我们将cameo.py
文件修改为使用PygameWindowManager
而不是WindowManager
。 在cameo.py
中找到以下行:
from managers import WindowManager, CaptureManager
将其替换为:
from managers import PygameWindowManager as WindowManager, \CaptureManager
就这样! 现在,cameo.py
使用一个 Pygame 窗口,当单击标准“关闭”按钮时,该窗口应该关闭。
Pygame 的进一步使用
我们仅使用了pygame.display
和pygame.event
模块的一些基本功能。 Pygame 提供了更多功能,包括:
- 绘制 2D 几何
- 绘制文字
- 管理可绘制 AI 实体(精灵)的分组
- 捕获与窗口,键盘,鼠标和操纵杆/游戏手柄相关的各种输入事件
- 创建自定义事件
- 播放和合成声音和音乐
例如,Pygame 可能是使用计算机视觉的游戏的合适后端,而 HighGUI 则不是。
总结
到现在为止,我们应该有一个应用,该应用使用 OpenCV 捕获(并可能操纵)图像,同时使用 Pygame 显示图像和捕获事件。 从这个基本的集成示例开始,您可能想扩展PygameWindowManager
来包装其他 Pygame 功能,或者您想创建另一个WindowManager
子类来包装另一个库。
附录 B:为自定义目标生成 Haar 级联
本附录显示了如何生成 Haar 级联 XML 文件,如第 4 章“使用 Haar 级联跟踪面部”中所使用的文件。 通过生成自己的级联文件,我们可以潜在地跟踪任何模式或对象,而不仅仅是面部。 但是,好的结果可能不会很快出现。 我们必须仔细收集图像,配置脚本参数,执行实际测试并进行迭代。 可能涉及大量的人工时间和处理时间。
收集正面和负面的训练图像
你知道抽认卡的教学法吗? 这是一种向幼儿教授单词和识别技巧的方法。 老师给全班同学展示了一系列图片,并说了以下内容:
“这是牛。Mo!这是马。Neigh!”
级联文件的生成方式类似于抽认卡教学法。 要学习如何识别母牛,计算机需要预先识别为母牛的正训练图像和预先识别为“非母牛”的负训练图像。 作为训练师,我们的第一步是收集这两套图像。
在确定要使用多少个正面训练图像时,我们需要考虑用户查看目标的各种方式。 理想,最简单的情况是目标是始终在平坦表面上的 2D 图案。 在这种情况下,一个正面的训练图像可能就足够了。 但是,在其他情况下,可能需要数百甚至数千张训练图像。 假设目标是您所在国家的国旗。 当在文档上打印时,标志的外观可能可预测,但是当在顺风飘扬的织物上打印时,标志的外观变化很大。 诸如人脸之类的自然 3D 目标的外观范围可能更大。 理想情况下,我们的一组正面训练图像应代表我们的相机可能捕获的许多变化。 可选地,我们的任何正面训练图像都可以包含目标的多个实例。
对于我们的负面训练集,我们需要大量图像,这些图像不包含目标的任何实例,但确实包含相机可能捕获的其他内容。 例如,如果一面旗帜是我们的目标,那么我们的负面训练集可能包括各种天气情况下的天空照片。 (天空不是旗帜,但经常在旗帜后面看到。)不过不要假设太多。 如果相机的环境无法预测,并且目标出现在许多设置中,请使用各种各样的负面训练图像。 考虑构建一套通用的环境图像,您可以在多个训练方案中重复使用这些图像。、
查找训练可执行文件
为了使级联训练尽可能自动化,OpenCV 提供了两个可执行文件。 它们的名称和位置取决于操作系统和 OpenCV 的特定设置,如以下两节所述。
在 Windows 上
Windows 上的两个可执行文件称为ONopencv_createsamples.exe
和ONopencv_traincascade.exe
。 它们不是预建的。 而是,仅当您从源代码编译 OpenCV 时,它们才存在。 根据您在第 1 章“设置 OpenCV”中选择的编译方法,它们的父文件夹是以下文件夹之一:
- MinGW:
<unzip_destination>\bin
- Visual Studio 或 Visual C++ Express:
<unzip_destination>\bin\Release
如果要将可执行文件的文件夹添加到系统的Path
变量中,请参考第 1 章,“设置 OpenCV”的“在 Windows XP,Windows Vista,Windows 7 和 Windows 8 上进行选择”部分的信息框中的说明。 否则,请注意可执行文件的完整路径,因为我们将需要在运行它们时使用它。
在 Mac,Ubuntu 和其他类似 Unix 的系统上
Mac,Ubuntu 和其他类似 Unix 的系统上的两个可执行文件称为opencv_createsamples
和opencv_traincascade
。 它们的父文件夹是以下文件夹之一,具体取决于您的系统和在第 1 章“设置 OpenCV”中选择的方法:
- 带有 MacPorts 的 Mac:
/opt/local/bin
- 带有 Homebrew 的 Mac:
/opt/local/bin
或/opt/local/sbin
- 具有 Apt 的 Ubuntu:
/usr/bin
- 使用我的自定义安装脚本的 Ubuntu:
/usr/local/bin
- 其他类 Unix 系统:
/usr/bin
和/usr/local/bin
除 Mac 带有 Homebrew 的情况外,默认情况下,可执行文件的文件夹应位于PATH
中。 对于 Homebrew,如果要将相关文件夹添加到PATH
,请参阅第 1 章,“设置 OpenCV”的“使用 Homebrew 和现成的包(不支持深度摄像头)”第二部分中的说明。 否则,请注意可执行文件的完整路径,因为我们需要在运行它们时使用它。
创建训练集和级联
此后,我们将这两个可执行文件称为<opencv_createsamples>
和<opencv_traincascade>
。 切记替换适合您的系统和设置的路径和文件名。
这些可执行文件具有某些数据文件作为输入和输出。 以下是生成这些数据文件的典型方法:
- 手动创建一个描述负面训练图像集的文本文件。 我们将此文件称为
<negative_description>
。 - 手动创建一个描述正面训练图像集的文本文件。 我们将此文件称为
<positive_description>
。 - 以
<negative_description>
和<positive_description>
作为参数运行<opencv_createsamples>
。 该可执行文件将创建一个描述训练数据的二进制文件。 我们将后一个文件称为<binary_description>
。 - 以
<binary_description>
作为参数运行<opencv_traincascade>
。 该可执行文件创建二进制级联文件,我们将其称为<cascade>
。
我们可以选择<negative_description>
,<positive_description>
,<binary_description>
和<cascade>
的实际名称和路径。
现在,让我们详细了解三个步骤。
创建<negative_description>
<negative_description>
是一个文本文件,列出了所有负面训练图像的相对路径。 路径应由换行符分隔。 例如,假设我们具有以下目录结构,其中<negative_description>
是negative/desc.txt
:
negativedesc.txtimagesnegative 0.pngnegative 1.png
然后,negative/desc.txt
的内容可能如下:
"images/negative 0.png"
"images/negative 1.png"
对于少量图像,我们可以手动编写这样的文件。 对于大量图像,我们应该改用命令行来查找与特定模式匹配的相对路径,并将这些匹配输出到文件中。 继续我们的示例,我们可以通过在 Windows 的“命令提示符”中运行以下命令来生成negative/desc.txt
:
> cd negative
> forfiles /m images\*.png /c "cmd /c echo @relpath" > desc.txt
请注意,在这种情况下,相对路径的格式为.\images\negative 0.png
,这是可以接受的。
另外,在类似 Unix 的外壳中,例如 Mac 或 Ubuntu 上的 Terminal,我们可以运行以下命令:
$ cd negative
$ find images/*.png | sed -e "s/^/\"/g;s/$/\"/g" > desc.txt
创建<positive_description>
如果我们有多个正面训练图像,则需要使用<positive_description>
。 否则,请继续下一节。 <positive_description>
是一个文本文件,列出了所有积极训练图像的相对路径。 在每个路径之后,<positive_description>
还包含一系列数字,这些数字指示在图像中找到了多少个目标实例,以及哪些子矩形包含了这些目标实例。 对于每个子矩形,数字按以下顺序排列:x,y,宽度和高度。 考虑以下示例:
"images/positive 0.png" 1 120 160 40 40
"images/positive 1.png" 2 200 120 40 60 80 60 20 20
在此,images/positive 0.png
包含子矩形中目标的一个实例,该子矩形的左上角为(120, 160)
,右下角为(160, 200)
。 同时,images/positive 1.png
包含目标的两个实例。 一个实例位于子矩形中,该子矩形的左上角为(200, 120)
,而其右下角为(240, 180)
。 另一个实例位于子矩形中,该子矩形的左上角为(80, 60)
,右下角为(100, 80)
。
要创建这样的文件,我们可以以与<negative_description>
相同的方式开始生成图像路径列表。 然后,我们必须基于对图像的专家(人类)分析,手动添加有关目标实例的数据。
通过运行<opencv_createsamples>
创建<binary_description>
假设我们有多个正面训练图像,因此,我们创建了<positive_description>
,现在可以通过运行以下命令来生成<binary_description>
:
$ <opencv_createsamples> -vec <binary_description> -info <positive_description> -bg <negative_description>
另外,如果我们有一个正面的训练图像,我们将其称为<positive_image>
,则应改为运行以下命令:
$ <opencv_createsamples> -vec <binary_description> -image <positive_image> -bg <negative_description>
对于其他<opencv_createsamples>
标志(可选),请参见官方文档。
通过运行<opencv_traincascade>
创建<cascade>
最后,我们可以通过运行以下命令生成<cascade>
:
$ <opencv_traincascade> -data <cascade> -vec <binary_description> -bg <negative_description>
有关<opencv_traincascade>
的其他(可选)标志的信息,请参见官方文档。
提示
发声
为了好运,在运行<opencv_traincascade>
时发出模仿声音。 例如,说“ Moo!” 如果正面训练图像是母牛。
测试和改进<cascade>
<cascade>
是与 OpenCV 的CascadeClassifier
类的构造器兼容的 XML 文件。 对于如何使用CascadeClassifier
的示例,请参考第 4 章“用 Haar 级联跟踪人脸”的FaceTracker
实现。 。 通过复制和修改FaceTracker
和Cameo
,您应该能够创建一个简单的测试应用,该应用在跟踪的自定义目标实例周围绘制矩形。
也许在您第一次尝试级联训练时,您将不会获得可靠的跟踪结果。 要提高训练效果,请执行以下操作:
- 考虑使分类问题更具体。 例如,
bald, shaven, male face without glasses
级联可能比普通的face
级联更容易训练。 稍后,随着结果的改善,您可以尝试再次扩大问题范围。 - 收集更多的训练图像,更多!
- 确保
<negative_description>
包含所有负面训练图像,仅包含负面训练图像。 - 确保
<positive_description>
包含所有正面训练图像,仅包含正面训练图像。 - 确保
<positive_description>
中指定的子矩形正确。 - 查看并尝试使用
<opencv_createsamples>
和<opencv_traincascade>
的可选标志。 这些标志在这个页面的官方文档中进行了描述。
祝你好运,寻找图像!
总结
我们已经讨论了用于生成与 OpenCV 的CascadeClassifier
兼容的级联文件的数据和可执行文件。 现在,您可以开始收集您喜欢的事物的图像并为其训练分类器!
相关文章:

Python OpenCV 计算机视觉:6~7
原文:OpenCV Computer Vision with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最…...

LabView中数组的使用2-1
在LabView中,数组用来管理相同类型的数据。 1 在前面板中创建数组 1.1 创建空数组 在前面板中创建数组时,首先在前面板中点击鼠标右键,弹出“控件”对话框,之后选择“新式->数组、矩阵与簇->数组”,在前面板中…...

Android 10.0 系统systemui下拉通知栏的通知布局相关源码分析
1.前言 在android10.0的系统rom开发中,在进行systemui中的下拉通知栏的布局自定义的时候,对于原生systemui的 系统的下拉通知栏的通知布局的了解也是非常重要的,接下来就来分析下相关的下拉通知栏的通知布局的相关 源码流程,了解这些才方便对通知栏的布局做修改 2.系统…...

研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型)
研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型) 变量|常量与可变性变量声明案例为什么不可变变量可变(mut关键字)变量可变(覆盖) 常量声明 数据类型标量类型整型整型字面值整型溢出问…...

接口的多继承多实现
接口的多继承多实现 目录 接口的多继承多实现多继承(接口1 extends 接口2,接口3)多实现(实现类 实现 接口1,接口2)总结1.类与类的关系2.类和接口的关系3.接口与接口的关系 多继承(接口1 extends 接口2,接口…...

腾讯-iOS面试题-答案
一面 1、介绍一下实习的项目,任务分工,做了哪些工作?介绍实习内容 2、网络相关的:项目里面使用到什么网络库,用过ASIHTTP库吗 在iOS开发中,常用的网络库包括: URLSession:苹果官方提供的网络…...

SQL Server内存架构
2. 内存架构 所谓内存架构,这里是指SQL Server实例内存管理、使用与相关逻辑设计及实现等方面内容。更具体一点,就是讲SQL Server实例分配、管理和使用其内存空间的内部机制。本书1.1节中我们已经讲过,SQL Server实例包括多个内部机制各不相同的内存区域,在此,我们将讲解…...

有哪些功能强大,但是很小众的Python库呢?
Python生态系统中有很多小众但非常强大的库,一般,通俗的规律就是,越是高端,越小众,但是,高端不代表难学,只要理论到了,用起来照样嗖嗖的,以下是一些参考的高端小众库&…...

SpringBoot设计了哪些可拓展的机制?
SpringBoot核心源码 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { ...this.primarySources new LinkedHashSet(Arrays.asList(primarySources));// Servletthis.webApplicationType WebApplicationType.deduceFromClass…...

Layer组件多个iframe弹出层打开与关闭及参数传递
Layer官网地址:http://layer.layui.com/ 1、多个iframe弹出层(非嵌套) 1.打开iframe弹出层js代码 (1)示例一: content参数可传入要打开的页面,type参数传2,即可打开iframe类型的弹层…...

BearPi环境搭建及基本使用
这是一篇总结,一些坑的记录 具体教程请访问: BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码 - Gitee.com 第一步:安装虚拟机 不做赘述 第二步:下载资源 这里要用到ubuntu的一些基础知识,不会的…...

算法笔记-换根DP
换根DP 一般是给定一棵不定根树,求以每个节点为根的一些信息。可以通过二次扫描: 第一次扫描,任选一点为根,在有根树上,自底向上转移第二次扫描,从上一次扫描的根开始,自顶向下计算 P3478 [P…...

LeetCode 785. Is Graph Bipartite【DFS,二分图】中等
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

【微信小程序】-- 分包 - 独立分包 分包预下载(四十五)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...

2.3 连续性随机变量
思维导图: 学习目标: 我会按照以下步骤学习连续型随机变量: 复习概率论的基础知识,包括概率、期望、方差等概念和公式,以及离散型随机变量的概率分布函数和概率质量函数的概念和性质。 学习连续型随机变量的概念和性…...

【DES详解】(一)处理input block(64 bits)
一、DES 加密算法总览 0-1、初识置换 IP(Initial Permutation) 输入:明文(64 bits) 过程:初识置换 输出:处理后的明文permuted input(64 bits) 首先,对需要解…...

redis笔记——三种特殊的数据结构
三种特殊数据类型 geospatial(地理位置) 用于定位,附近的人,距离计算 添加元素 geoadd key 经度 纬度 描述名称,可一次添加多个元素 127.0.0.1:6379> geoadd china:city 113.28 23.12 guangzhou (integer) 1 1…...

网络安全之编码加密算法
网络安全之编码加密算法 一、ROT5/13/18/47编码转换二、MD5加密 一、ROT5/13/18/47编码转换 ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码,属于凯撒密码的一种。此类编码具有可逆性,可以自我解密,主要用于应对快速浏览&…...

mp4视频无法播放的解决方法
mp4视频是我们日常工作生活中经常会遇到的视频格式,但如果遇到重要的mp4视频无法播放了,该怎么办呢?有mp4视频无法播放的解决方法吗?下面小编为大家整理了这个问题产生的原因以及相应的解决方法,让我们看一看。 什么情况下会导致mp4视频无法…...

搭建Mysql
登录root账号 su root #上传 mysql-advanced-5.7.17-linux-glibc2.5-x86_64.tar.gz #创建mysql的用户组/用户, data目录及其用户目录 groupadd mysql useradd -g mysql -d /home/mysql mysql mv mysql-advanced-5.7.17-linux-glibc2.5-x86_64 mysql mkdir /home/mysql/data…...

气传导和骨传导耳机哪个好?简单科普这两种蓝牙耳机
在生活中,我们经常会用到耳机,特别是在日常娱乐听歌、运动休闲、户外通勤的时候,一款舒适的耳机是必不可少的。 而最近几年,随着科技的发展,各大品牌也相继推出了各种类型的耳机,其中比较热门的就有气传导…...

浅尝GoWeb开发之Gin框架
一、框架简介 gin 目前应用最广泛的golang框架,甚至已经变成了golang的官方框架,但它主要是一个RESTFul的框架。封装比较优雅,API友好,源码注释比较明确。个人比较推荐。 beego 国内最早的golang框架,也是最全的MV…...

工程行业管理系统-专业的工程管理软件-提供一站式服务
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示1…...

目标检测YOLO系列-YOLOV7运行步骤(推理、训练全过程)
下载源代码:点击下载 进入项目根目录并执行以下命令安装requirements.txt中的相关依赖 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple官网下载权重yolov7.pt(测试使用)、yolov7-tiny.pt(训练使用…...

Spring Boot + Spring Security基础入门教程
Spring Security简介 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。Spring Security 致力于为 Java 应用程序提供身份验证和授权的能力。 Spring Security 两大重要核心功能:用户认证(Authentication)和用户授权&am…...

MySQL数据库,表的增删改查详细讲解
目录 1.CRUD 2.增加数据 2.1创建数据 2.2插入数据 2.2.1单行插入 2.2.2多行插入 3.查找数据 3.1全列查询 3.2指定列查询 3.3查询字段为表达式 3.3.1表达式不包含字段 3.3.2表达式包含一个字段 3.3.3表达式包含多个字段 3.4起别名 3.5distinct(去重) 3.6order …...

SpringCloud-Gateway实现网关
网关作为流量的入口,常用的功能包括路由转发、权限校验、限流等 Spring Cloud 是Spring官方推出的第二代网关框架,由WebFluxNettyReactor实现的响应式的API网关,它不能在传统的servlet容器工作,也不能构建war包。基于Filter的方式…...

Redis 如何配置读写分离架构(主从复制)?
文章目录 Redis 如何配置读写分离架构(主从复制)?什么是 Redis 主从复制?如何配置主从复制架构?配置环境安装 Redis 步骤 通过命令行配置从节点通过配置文件配置从节点Redis 主从复制优点Redis 主从复制缺点 Redis 如何…...

代码随想录二刷day05 | 哈希表之242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
当遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了 二刷day05 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和 242.有效的字母异位词 题目链接 解题思路: class Solution { public:bool isAnagram(string s, string…...

2023年4月广东省计算机软考中/高级备考班招生简章
软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…...