EmguCV学习笔记 VB.Net 4.4 图像形态学
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客
教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客
笔者的博客网址:https://blog.csdn.net/uruseibest
教程配套文件及相关说明以及如何获得pdf教程和代码(博客上的教程内容会和pdf教程一致,教程中也会包含所有代码),请移步:EmguCV学习笔记
4.4 图像形态学
图像形态学是数字图像处理中的一种重要技术,它主要用于对二值图像进行分析和处理。图像形态学可以用于图像去噪、边缘检测、形态分析等方面。EmguCV提供了一系列的图像形态学操作函数,包括膨胀、腐蚀、开运算、闭运算等。
1. 膨胀 (Dilation)
膨胀是一种形态学操作,其基本思想是用一个结构元素 (Structuring Element) 在图像上滑动,将结构元素包含的像素值中的最大值作为当前像素值,从而实现对图像边缘的扩张和增强。EmguCV中的膨胀函数为CvInvoke.Dilate。
2. 腐蚀 (Erosion)
腐蚀是一种形态学操作,其基本思想是用一个结构元素在图像上滑动,将结构元素包含的像素值中的最小值作为当前像素值,从而实现对图像边缘的收缩和平滑。EmguCV中的腐蚀函数为CvInvoke.Erode。
3. 开运算 (Opening)
开运算是一种形态学操作,其基本思想是先进行一次腐蚀操作,再进行一次膨胀操作,从而可以去除比较小的物体、断开细长的物体等。EmguCV中的开运算函数为CvInvoke.MorphologyEx,其类型为MorphOp.Open。
4. 闭运算 (Closing)
闭运算是一种形态学操作,其基本思想是先进行一次膨胀操作,再进行一次腐蚀操作,从而可以填充物体内的小孔、连接断开的物体等。EmguCV中的闭运算函数为CvInvoke.MorphologyEx,其类型为MorphOp.Close。
图像形态学操作需要根据图像的特点和处理目的进行合理的选择和组合,才能达到良好的效果。
注意:图像形态学针对的是非黑色部分(非0部分)操作。
4.4.1 GetStructuringElement
通过CvInvoke.GetStructuringElement方法可以创建形态学操作的结构元素。该方法返回一个Mat对象。定义如下:
Public Shared Function GetStructuringElement(shape As Emgu.CV.CvEnum.ElementShape, ksize As System.Drawing.Size, anchor As System.Drawing.Point) As Emgu.CV.Mat
参数说明:
- shape:结构元素的形状,可以是Rectangle(矩形)、Cross(十字形)、Ellipse(椭圆形)。
- size:结构元素的大小。
- anchor:结构元素的锚点位置,用Point结构指定。可以使用 Nothing 或者(-1,-1),表示将锚点放置在结构元素的中心。
下面的代码创建了一个3x3的十字形结构元素:
Dim element As Mat
element= CvInvoke.GetStructuringElement(ElementShape.Cross, New Size(3, 3))
4.4.2 Erode
Erode方法对图像进行腐蚀操作,该方法声明如下:
Public Shared Sub Erode(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, element As Emgu.CV.IInputArray, anchor As System.Drawing.Point, iterations As Integer, borderType As Emgu.CV.CvEnum.BorderType, borderValue As Emgu.CV.Structure.MCvScalar)
参数说明:
- element:结构元素。
- anchor:结构元素的锚点位置,类型为Point。指定结构元素的锚点位置,一般为结构元素的中心,即(-1,-1)。
- iterations:腐蚀操作的迭代次数,类型为Integer。默认为1,表示进行一次腐蚀操作。
- Iterations:操作的迭代次数,类型为Integer。默认为1,表示进行一次膨胀操作。
- borderType:边界处理方式,类型为BorderType(详见4.2.1节【BorderType】)。需要注意的是,使用的BorderType类型不同生成结果不同。
- borderValue:边界值,类型为MCvScalar。当borderType为BorderType.Constant时,可以指定边界的像素值。通常设置为Nothing。
【代码位置:frmChapter4】Button12_Click、printMatByte
'Erode腐蚀
Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click
'创建结构元素,这里是一个3*3大小的十字形结构
Dim kernel As New Mat
kernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))
Dim bte1(,) As Byte
bte1 = {
{0, 1, 1, 1, 1, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1, 1, 0},
{1, 1, 1, 1, 1, 1, 1, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 1, 1, 1, 1, 0}
}
Dim matr1 As New Matrix(Of Byte)(bte1)
Dim m1 As New Mat
m1 = matr1.Mat
Dim merode As New Mat '
'这里使用了2次迭代
CvInvoke.Erode(m1, merode, kernel, New Point(-1, -1), 2, BorderType.Constant, Nothing)
Call printMatByte(merode)
End Sub
'输出Mat的值
Private Sub printMatByte(ByVal m As Mat)
Dim matr As New Matrix(Of Byte)(m.Rows, m.Cols, m.NumberOfChannels)
m.CopyTo(matr)
For i As Integer = 0 To matr.Rows - 1
For j As Integer = 0 To matr.Cols - 1
Console.Write(matr(i, j))
If j <> matr.Cols - 1 Then
Console.Write(",")
End If
Next
Console.WriteLine()
Next
End Sub
下图演示了使用腐蚀进行2次迭代的结果:
图4-12 进行二次腐蚀的情况
4.4.3 Dilate
Dilate方法对图像进行膨胀操作,该方法声明如下:
Public Shared Sub Dilate(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, element As Emgu.CV.IInputArray, anchor As System.Drawing.Point, iterations As Integer, borderType As Emgu.CV.CvEnum.BorderType, borderValue As Emgu.CV.Structure.MCvScalar)
参数请参看4.3.2节【Erode】中的介绍。
【代码位置:frmChapter4】Button13_Click
'Dilate 膨胀
Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click
'创建结构元素,这里是一个3*3大小的十字形结构
Dim kernel As New Mat
kernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))
Dim bte2(,) As Byte
bte2 = {
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 1, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
}
Dim matr2 As New Matrix(Of Byte)(bte2)
Dim m2 As New Mat
m2 = matr2.Mat
Dim mdilate As New Mat
'这里使用了2次迭代进行膨胀
CvInvoke.Dilate(m2, mdilate, kernel, New Point(-1, -1), 2, BorderType.Constant, Nothing)
Call printMatByte(mdilate)
End Sub
下图演示了使用腐蚀进行2次迭代的结果:
图4-13 进行二次膨胀的情况
以下代码演示了使用腐蚀和膨胀来处理图像。
【代码位置:frmChapter4】Button14_Click
'Erode和Dilate
Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Button14.Click
Dim m As Mat = CvInvoke.Imread("C:\lessons\lena.jpg", CvEnum.ImreadModes.Color)
ImageBox1.Image = m
Dim mElement As New Mat
mElement = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))
'腐蚀
Dim mout1 As New Mat
CvInvoke.Erode(m, mout1, mElement, New Point(-1, -1), 2, BorderType.Default, Nothing)
ImageBox2.Image = mout1
'膨胀
Dim mout2 As New Mat
CvInvoke.Dilate(m, mout2, mElement, New Point(-1, -1), 2, BorderType.Default, Nothing)
ImageBox3.Image = mout2
End Sub
运行后如下图所示:
图4-14 使用腐蚀和膨胀处理图像
4.4.4 MorphologyEx
为了实现更多图像形态学操作,EmguCV提供了CvInvoke.MorphologyEx方法,声明如下:
Public Shared Sub MorphologyEx(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, operation As Emgu.CV.CvEnum.MorphOp, kernel As Emgu.CV.IInputArray, anchor As System.Drawing.Point, iterations As Integer, borderType As Emgu.CV.CvEnum.BorderType, borderValue As Emgu.CV.Structure.MCvScalar)
参数说明,其余参数请参看4.3.2节【Erode】中的介绍:
- operation:形态学操作类型,类型为MorphOp,包括以下几种形态学操作:
- Dilate:膨胀操作,
- Erode:腐蚀操作。
- Open:开运算,先进行腐蚀再进行膨胀,可以用于去除小的噪点和连接断开的区域。
- Close:闭运算,先进行膨胀再进行腐蚀,可以用于填充小的空洞和分离连接的区域。
- Gradient:梯度运算,用膨胀图像减去腐蚀图像,可以得到图像边缘。
- TopHat:高帽运算,用原始图像减去开运算后的图像,可以提取图像中的亮点或小的细节信息。
- BlackHat:低帽运算,用闭运算后的图像减去原始图像,可以提取图像中的暗点或背景信息。
- HitMiss:击中击不中运算,用于确定图像中是否存在指定的形状。它需要两个结构元素:一个前景结构元素和一个背景结构元素。在输入图像上,如果前景结构元素可以同时与前景像素和背景像素匹配,那么该像素属于击中集合;否则,它属于击不中集合。通过对击中集合进行膨胀操作并减去原始击中集合得到最终结果。
以下代码演示了使用开运算来处理图像数据,同时与腐蚀,膨胀操作图像数据做对比。
【代码位置:frmChapter4】Button15_Click
'MorphologyEx:开运算:先腐蚀,再膨胀
Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click
Dim bte(,) As Byte
bte = {
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 0, 0, 0, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 0, 0, 0, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 1, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
}
Dim matr As New Matrix(Of Byte)(bte)
Dim m As New Mat
m = matr.Mat
'创建结构元素,这里是一个3*3大小的十字形结构
Dim kernel As New Mat
kernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))
'进行开运算
Dim mMorphology As New Mat
CvInvoke.MorphologyEx(m, mMorphology, MorphOp.Open, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)
Call printMatByte(mMorphology)
Console.WriteLine("===============================")
'先腐蚀
Dim merode As New Mat
CvInvoke.Erode(m, merode, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)
Call printMatByte(merode)
Console.WriteLine("===============================")
'再膨胀
Dim mdilate As New Mat
CvInvoke.Dilate(merode, mdilate, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)
Call printMatByte(mdilate)
End Sub
下图演示了使用开运算处理图像数据的结果:
图4-15 开运算处理图像数据
以下代码演示了使用闭运算来处理图像数据,同时与膨胀,腐蚀操作图像数据做对比。
【代码位置:frmChapter4】Button16_Click
'MorphologyEx:闭运算:先膨胀,再腐蚀
Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click
Dim bte(,) As Byte
bte = {
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 1, 1, 1, 0},
{0, 1, 1, 1, 0, 1, 1, 1, 0},
{0, 1, 1, 1, 1, 1, 1, 1, 0},
{0, 1, 1, 1, 0, 1, 1, 1, 0},
{0, 0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 0, 1, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
}
Dim matr As New Matrix(Of Byte)(bte)
Dim m As New Mat
m = matr.Mat
'创建结构元素,这里是一个3*3大小的十字形结构
Dim kernel As New Mat
kernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))
'闭运算
Dim mMorphology As New Mat
CvInvoke.MorphologyEx(m, mMorphology, MorphOp.Close, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)
Call printMatByte(mMorphology)
Console.WriteLine("===============================")
'先膨胀
Dim mdilate As New Mat
CvInvoke.Dilate(m, mdilate, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)
Call printMatByte(mdilate)
Console.WriteLine("===============================")
'再腐蚀
Dim merode As New Mat
CvInvoke.Erode(mdilate, merode, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)
Call printMatByte(merode)
End Sub
下图演示了使用闭运算处理图像数据的结果:
图4-16 闭运算处理图像数据
以下代码演示了使用闭运算和开运算来处理图像。
【代码位置:frmChapter4】Button17_Click
'MorphologyEx:开运算和闭运算处理图像
Private Sub Button17_Click(sender As Object, e As EventArgs) Handles Button17.Click
Dim m As Mat = CvInvoke.Imread("C:\lessons\lena.jpg", CvEnum.ImreadModes.Color)
ImageBox1.Image = m
Dim mElement As New Mat
mElement = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))
'开运算
Dim mout1 As New Mat
CvInvoke.MorphologyEx(m, mout1, MorphOp.Open, mElement, New Point(-1, -1), 3, BorderType.Default, New MCvScalar(0, 0, 0))
ImageBox2.Image = mout1
'闭运算
Dim mout2 As New Mat
CvInvoke.MorphologyEx(m, mout2, MorphOp.Close, mElement, New Point(-1, -1), 3, BorderType.Default, New MCvScalar(0, 0, 0))
ImageBox3.Image = mout2
End Sub
运行后如下图所示:
图4-17 开运算和闭运算处理图像
相关文章:

EmguCV学习笔记 VB.Net 4.4 图像形态学
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSD…...

HarmonyOS 开发
环境 下载IDE 代码 import { hilog } from kit.PerformanceAnalysisKit; import testNapi from libentry.so; import { router } from kit.ArkUI; import { common, Want } from kit.AbilityKit;Entry Component struct Index {State message: string Hello HarmonyOS!;p…...

拒绝拖延!Kimi助你一天内速成论文初稿!
撰写学术论文是一项需要周密计划和精确执行的任务。它要求作者对文章的每个部分进行深入思考,以确保论文结构的合理性和论述的清晰度。利用Kimi的功能,我们可以更系统地进行写作,从构思到最终成稿,逐步构建出一篇高质量的学术论文…...

Python画笔案例-005 绘制迷宫
1、绘制迷宫 通过 python 的turtle 库绘制一个迷宫的图案,如下图: 2、实现代码 从图上可以看出,内测最短的竖线开始,每次右转 90 度后,线段都增加 8 个单位,所以我们是用 for 循环,循环 50 次…...

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用性能优化二(代码层面)
学完时间:2024年8月22日 学完排名:第1801名 一、长列表优化概述 列表是应用开发中最常见的一类开发场景,它可以将杂乱的信息整理成有规律、易于理解和操作的形式,便于用户查找和获取所需要的信息。应用程序中常见的列表场景有新…...

【Docker】如何将A机器内的镜像,导入到B机器?
由于网络或者仓库的原因,经常遇到pull拉取镜像失败的情况!! 那么,如何将A机器内的镜像,通过命令,导入到B机器? 两条重要的命令: 1,在已经成功拉取pull的机器上执行命令…...

动手实现基于Reactor模型的高并发Web服务器(一):epoll+多线程版本
系统流程概览 main函数 对于一个服务器程序来说,因为要为外部的客户端程序提供网络服务,也就是进行数据的读写,这就必然需要一个 socket 文件描述符,只有拥有了文件描述符 C/S 两端才能通过 socket 套接字进行网络通信࿰…...

爬虫案例4——爬取房天下数据
简介:个人学习分享,如有错误,欢迎批评指正 任务:从房天下网中爬取小区名称、地址、价格和联系电话 目标网页地址:https://newhouse.fang.com/house/s/ 一、思路和过程 目标网页具体内容如下: …...

网络硬盘录像机NVR程序源码NVR全套运用方案
在当今社会,随着科技的飞速发展和人们对安全需求的日益增长,安防监控系统已成为保障公共安全、维护社会稳定的重要手段。其中,网络视频录像机(NVR)作为安防监控系统的核心设备,其智能化升级运用方案对于提高…...

03:电容的充放电特性及应用举例
1.电容的基本特性:电容两端的电压不能突变 2.影响电容两端电压的参数:整个回路中电阻,电容大小 3.如何计算电容的电压变化时间? τRC R1k C1uF 则得到τ1ms的时间 应用:芯片使能延时...

【专题】2023-2024中国游戏企业研发竞争力报告合集PDF分享(附原数据表)
原文链接: https://tecdat.cn/?p37447 在当今的数字时代,游戏产业已然成为经济与文化领域中一股不可忽视的重要力量。2023 年,中国自研游戏市场更是呈现出一片繁荣且复杂的景象,实际销售收入达到了令人瞩目的 2563.8 亿元&#x…...

会话跟踪方案:Cookie Session Token
什么是会话技术? Cookie 以登录为例,用户在浏览器中将账号密码输入并勾选自动登录,浏览器发送请求,请求头中设置Cookie:userName:张三 ,password:1234aa ,若登录成功,服务器将这个cookie保存…...

jemeter压力测试入门
1. 安装jemeter的压缩包并且解压 点击运行 2. 添加线程组 3. 线程组的参数设置 4. 添加http请求 5. 填写请求信息 添加监听器——结果树(结果),聚合报告(吞吐量报告) 6. 通过cvs数据文件设置,配置元件&…...

SpringBoot3 简单集成 Spring AI 并使用
文章目录 准备JDK17api key 创建项目编写配置文件创建controller启动并测试角色预设流式响应\异步响应ChatModel(聊天模型)ImageModel(文生图)文生语音语言翻译多模态Function Calling (函数调用第三方API)…...

【C/C++】程序设计基础知识(数据类型与表达式、控制语句、数组与结构)
【C/C】程序设计基础知识(数据类型与表达式、控制语句、数组与结构) 一、数据类型与表达式1.1C语言符号1.2C语言运算符1.3数据类型1.4常量与变量1.5基本运算1.6优先级和结合性1.7输入与输出 二、控制语句2.1顺序结构2.2选择结构2.3循环结构2.4break,cont…...

python库——sklearn的关键组件和参数设置
文章目录 模型构建线性回归逻辑回归决策树分类器随机森林支持向量机K-近邻 模型评估交叉验证性能指标 特征工程主成分分析标准化和归一化 scikit-learn,简称sklearn,是Python中一个广泛使用的机器学习库,它建立在NumPy、SciPy和Matplotlib这些…...

CAS-ViT实战:使用CAS-ViT实现图像分类任务(一)
摘要 在视觉转换器(Vision Transformers, ViTs)领域,随着技术的不断发展,研究者们不断探索如何在保持高效性能的同时,降低模型的计算复杂度,以满足资源受限场景(如移动设备)的需求。…...

处理数组下标的代码
以下是某个Ada编译器生成的一段汇编代码: mov ecx, eaxmov ebx, eaxsar ebx, 1Fhmov edx, ebxsar edx, 1Fhnot edxmov eax, edxsar eax, 1Fhand ecx, eax以上代码相当于以下C代码: ecx ((~(eax >> 62) >&…...

数学建模算法总结
数学建模常见算法总结 评价决策类模型 层次分析法 层次分析法根据问题的性质和要达到的总目的,将问题分解为不同的组成因素,并按照因素间的相互关联影响以及隶属关系将因素按不同层次聚集组合,形成一个多层次的分析结构模型,从…...

代码随想录算法训练营第五十五天 | 并查集理论基础、107. 寻找存在的路径
一、并查集理论基础 文章链接:并查集理论基础 | 代码随想录 (programmercarl.com) 二、107. 寻找存在的路径 题目连接:107. 寻找存在的路径 (kamacoder.com) 文章讲解:代码随想录 (programmercarl.com)——107. 寻找存在的路径...

ROS_package 、CMakeLists.txt、package.xml、ROS_node之间的关系
一、整体框架结构 二、关系描述 1、ROS.cpp 里面初始化了一个ROS节点,注意我的源文件里面只初始化了一个节点 // ROS.cpp #include "ros/ros.h"int main(int argc, char **argv) {ros::init(argc, argv, "node_name"); // 指定节点名称为 &…...

嵌入式学习----网络通信之TCP协议通信
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数 据无误、数据无丢失、数据无失序、数据无重复到达的通信) 适用情况: 1. 适合于对传输质量要求较高,以及传输大量数据 的通信。…...

【信息学奥赛一本通】1007:计算(a+b)×c的值
1007:计算(ab)c的值 时间限制: 1000 ms 内存限制: 65536 KB 提交数:184662 通过数: 150473 【题目描述】 给定3个整数a、b、c,计算表达式(ab)c的值。 【输入】 输入仅一行,包括三个整数a、b、c, 数与数之间以一个空格分开。(-10,…...

Linux系统之部署俄罗斯方块网页小游戏(三)
Linux系统之部署俄罗斯方块网页小游戏(三) 一、小游戏介绍1.1 小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查系统版本3.2 检查系统内核版本3.3 检查软件源四、安装Apache24.1 安装Apache2软件4.2 启动apache2服务4.3 查看…...

XSS- - - DOM 破坏案例与靶场
目录 链接靶场: 第一关 Ma Spaghet 第二关 Jefff 第三关 Ugandan Knuckles 第四关 Ricardo Milos 第五关 Ah Thats Hawt 第六关 Ligma 第七关 Mafia 第八关 Ok, Boomer 链接靶场: XS…...

Arco Design,字节跳动出品的UI库
Arco Design是字节跳动出品的UI库,支持Vue和React。还是比较美观的。并且Arco Design还提供了中后台模版。但是通过提供的arco-cli连接了github,正常情况下无法构建。但效果还是挺好的,下面是效果图: 更新: 传送门可…...

常用API:object
文章目录 Object类toString()方法equals()方法总结其他方法 黑马学习笔记 Object类 是所有类的父类,所有的类都默认继承Object类。Java中所有的类的对象都可以直接使用Object类提供的一些方法。 toString()方法 equals()方法 默认是判断两个对象的地址 也是判断…...

【计算机三级-数据库技术】数据库后台编程技术
内容提要 1、掌握存储过程的定义与使用 2、掌握用户定义函数的创建与使用 3、掌握触发器的定义与使用 4、掌握游标的定义与使用 第一节 存储过程 使用T-SQL语言编写,有两种方式存储: 在客户端存储代码通过客户端程序或SQL命令向DBMS发出操作请求&…...

线程的控制
互斥 概念 互斥:在多线程中对临界资源(公共资源)的排他性访问。 互斥机制 >>互斥锁 >>保证临界资源的访问控制。 通过使用互斥锁,可以确保某一时刻只有一个线程能够访问临界资源,从而避免竞争条件(race condition…...

WPS宏实现Sheet页拆分功能
源表格首列名称中一样的分别创建该名称的Sheet页,首先把首列复制导致Sheet2页,根据去重后的值创建新的Sheet页,把源表格数据复制到新建的Sheet页,遍历删除不需要的留下需要的就完成了。 function JIn521() { //设置工作…...