EmguCV学习笔记 VB.Net 9.1 VideoCapture类
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。
教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客
教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客
笔者的博客网址:https://blog.csdn.net/uruseibest
教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记
学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客
学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客
9.1 VideoCapture类
VideoCapture类是用于处理视频输入的类,它提供了多种方法用于从摄像头、视频文件、网络流等不同的源读取视频数据。
9.1.1 构造函数
VideoCapture类提供了2个构造函数:
1、Public Sub New (Optional camIndex As Integer = 0, Optional captureApi As VideoCapture. API = VideoCapture.API.Any)
- camIndex:要打开的摄像头的编号,例如0表示打开第一个摄像头
- captureApi:指定videocapture对象使用的视频捕获API,这是一个VideoCapture.API枚举,Windows下常用的成员有:
- Any:自动选择最佳的视频捕获API
- DShow:使用DirectShow视频捕获API。
- Vfw:使用Video for Windows视频捕获API。
- Ffmpeg:使用FFmpeg视频捕获API,但是需要安装相应的FFmpeg库。
2、Public Sub New (fileName As String, Optional captureApi As VideoCapture. API = VideoCapture.API.Any)
- fileName:要打开的视频文件路径或网络流地址。
- captureApi:指定videocapture对象使用的视频捕获API。
由于这个构造函数的两个参数均有默认值,所以在实际使用中,可以使用以下方法:
Public Sub New ()
Public Sub New (camIndex As Integer)
Public Sub New (fileName As String)
通常可以采用以下方法来从摄像头或文件获得视频:
1、打开本地第一个摄像头,
Dim capture As New VideoCapture(0)
2、打开本地视频文件
Dim capture As New VideoCapture ("D:\video.mp4")
3、打开网络流
Dim capture As New VideoCapture ("http://example.com/video.m3u8")
在EmguCV中,VideoCapture类支持许多网络视频协议,包括RTSP、HTTP、FTP、MMS等。通过使用不同的网络视频协议,可以从远程摄像头、网络摄像头或者网络视频流中获取视频数据。下面分别介绍一下这几种网络视频协议的使用方法。
1. RTSP协议
RTSP协议是一种用于实时数据传输的协议,常用于远程视频监控。
Dim capture As New VideoCapture("rtsp://192.168.1.100:554/live.sdp") ' 打开RTSP视频流
Dim capture As New VideoCapture ("rtsp://admin:***@ 192.168.1.100:554");
其中的网址是RTSP视频流的URL地址,需要根据实际修改。
2. HTTP协议
HTTP协议是一种广泛应用于互联网的协议,可以通过HTTP视频流获取网络摄像头或者网络视频流的视频数据。例如:
Dim capture As New VideoCapture("http://192.168.1.100:8080/video")
Dim capture As New VideoCapture("http://username:pass@cam_address/video.cgi? ")
其中的网址是HTTP视频流的URL地址,需要根据实际修改。
3. FTP协议
FTP协议是一种文件传输协议,可以通过FTP视频流获取网络摄像头或者网络视频流的视频数据。
Dim capture As New VideoCapture("ftp://192.168.1.100:21/video.mp4")
其中网址是FTP视频流的URL地址,需要根据实际修改。
4. MMS协议
MMS协议是一种多媒体流传输协议,可以通过MMS视频流获取网络摄像头或者网络视频流的视频数据。
Dim capture As New VideoCapture("mms://192.168.1.100:1755/video.wmv")
其中网址是MMS视频流的URL地址,需要根据实际修改。
注意:并非所有的网络视频协议都适用于所有的视频输入设备,有些视频输入设备可能不支持某些协议。在使用VideoCapture类打开网络视频流时,需要确认网络视频协议是否被支持。可以通过使用VideoCapture的BackendName属性获取VideoCapture类的后端名称,以判断是否支持某种网络视频协议。
【代码位置:frmChapter9_1】Button1_Click
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'下面测试视频的网址来自https://rtsp.stream/ ,可以用以下方法获得
'打开https://rtsp.stream/,点击Free下的"Get started"填写邮箱,打开邮箱,打开指定的链接后,会给出2个免费的有效地址。
Dim vc As New VideoCapture("rtsp://zephyr.rtsp.stream/pattern?streamKey=3c1b3e15c8904e1b7eea13468a085b3d")
Dim backendName As String = vc.BackendName
If backendName = "FFMPEG" Then ' 判断是否支持FFMPEG
'如果支持FFMPEG,可以使用RTSP、HTTP、FTP、MMS等网络视频协议
End If
End Sub
9.1.2 Get和Set方法
Get和Set方法用于获取或设置视频输入源的相关参数,例如视频分辨率、帧率、亮度、对比度等。这两个方法的重要参数是一个CapProp枚举,它包含很多重要的成员。例如:
1、获得VideoCapture对象视频相关属性:
VideoCapture.Get(CapProp.Fps) ' 获取视频帧率
VideoCapture.Get(CapProp.FrameWidth) ' 获取视频宽度
VideoCapture.Get(CapProp.FrameHeight) ' 获取视频高度
VideoCapture.Get(CapProp.FrameCount) ' 获取视频总帧数
VideoCapture.Get(CapProp.PosFrames) ' 获取视频当前帧数
VideoCapture.Get(CapProp.PosAvti) '获取视频当前帧的位置的属性值。
2、设置VideoCapture对象视频相关属性:
VideoCapture.Set(CapProp.FrameWidth, 640) ' 设置视频宽度为640像素
VideoCapture.Set(CapProp. FrameHeight,, 480) ' 设置视频高度为480像素
VideoCapture.Set(CapProp. Fps,, 30) ' 设置视频帧率为30帧/秒
VideoCapture.Set(CapProp. Brightness, 50) ' 设置视频亮度为50
VideoCapture.Set(CapProp. Contrast, 50) ' 设置视频对比度为50
【代码位置:frmChapter9_1】Button2_Click
'获得视频信息
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim vc As New VideoCapture("C:\learnEmgucv\movie1.mov")
Dim width As Double = vc.Get(CapProp.FrameWidth)
Dim height As Double = vc.Get(CapProp.FrameHeight)
Dim fps As Double = vc.Get(CapProp.Fps)
Dim FrameCount As Double = vc.Get(CapProp.FrameCount)
Dim Brightness As Double = vc.Get(CapProp.Brightness)
Dim Contrast As Double = vc.Get(CapProp.Contrast)
Console.WriteLine("视频宽度:" & width)
Console.WriteLine("视频高度:" & height)
Console.WriteLine("视频帧率:" & fps)
Console.WriteLine("视频总帧数:" & FrameCount)
Console.WriteLine("视频亮度:" & Brightness)
Console.WriteLine("视频对比度:" & Contrast)
vc.Dispose()
End Sub
注意:并非所有的视频属性都适用于所有的视频输入设备,有些视频输入设备可能不支持某些属性,比如Brightness、Contrast等属性只适合相机。在使用Set方法设置视频捕获属性时,最好先使用Get方法获取当前视频捕获属性的值,以便确认是否支持该属性。
【代码位置:frmChapter9_1】Button3_Click
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim vc As New VideoCapture("C:\learnEmgucv\movie1.mov")
'获取当前视频宽度属性的值
Dim width As Integer = vc.Get(CapProp.FrameWidth)
'判断是否支持该属性
If width > 0 Then
'设置视频宽度为640像素
vc.Set(CapProp.FrameWidth, 640)
End If
vc.Dispose()
End Sub
9.1.3 Retrieve、Read和Queryframe方法
这三种方法都是从视频中获得一幅图像。但是各有区别。
1、Retrieve不能自动读取下一帧,需要与Grab方法一起使用。而Grab方法只是获取下一帧的数据到一个用户无法访问的内存区,然后使用Retrieve方法根据通道号进行编码读取相应的图像。Read和Queryframe方法取出图像后可以自动转到下一帧图像
2、Retrieve可以返回多通道图像,比如使用立体摄像机,每一帧会返回两个图像;而Kinect会返回四个图像。Read和Queryframe方法不能读取多通道图像。
3、三种方法读取完视频(文件)最后一帧,返回的状态(详细请看示例代码):
- QueryFrame:IsNothing(m)=True(其中m为获得的Mat对象,下同),读取时,m所指向的数据指针DataPointer会变。
- Read:IsNothing(m)=False,m.IsEmpty=True,读取时,m所指向的数据指针DataPointer不会变。
- Retrieve:IsNothing(m)=False,m.IsEmpty= False,仍然会一直返回最后一帧的图像。因此需要判断是否达到最后一帧,即播放的当前帧是否是最后一帧。读取时,m所指向的数据指针DataPointer不会变。
由于上述三个方法以及Grab方法的使用都很简单,这里不再详述。
【代码位置:frmChapter9_1】Button4_Click
'播放视频
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim vc As New VideoCapture("C:\learnEmgucv\movie1.mp4")
'判断是否已经打开
If vc.IsOpened = False Then
Exit Sub
End If
'获得帧率
Dim fps As Double = vc.Get(CapProp.Fps)
'获得总的帧数
Dim framecount As Long = vc.Get(CapProp.FrameCount)
Dim m As Mat = New Mat()
Dim i As Long = 0
While True
'读取视频帧图像,三种方式:
'==1、使用Grab+Retrieve
If vc.Grab() = False Then
Exit While
End If
If vc.Retrieve(m) = False Then
Exit While
End If
'==2、使用Read
'vc.Read(m)
'==3、使用QueryFrame
'm = vc.QueryFrame
'如果m是空
If IsNothing(m) Then
Exit While
End If
'如果m未包含数据
If m.IsEmpty Then
Exit While
End If
'播放视频,两种方式
'==1、在imagebox1里面播放
'显示帧画面
ImageBox1.Image = m
'必须强制刷新,否则只会在结束时显示最后一帧画面
ImageBox1.Refresh()
'按照播放的帧率设置间隔时间
Threading.Thread.Sleep(1000 \ fps)
'==2、使用Imshow来播放
'显示帧画面
'CvInvoke.Imshow("video", m)
'等待按键
'CvInvoke.WaitKey(1000 / fps)
'判断是否已经是结束的一帧
If i >= framecount Then
Exit While
End If
i += 1
Label1.Text = i & "/" & framecount
'必须强制刷新,否则只会看到最后的结果
Label1.Update()
End While
'如果上述代码中使用了CvInvoke.Imshow来显示视频,那么这里应该销毁这个窗口
'CvInvoke.DestroyWindow("video")
vc.Dispose()
Label1.Text = "播放结束"
End Sub
输出结果如下图所示:

图9-1 视频播放
在播放时设置视频播放的起始点,可以使用两种方式,都需要用到Set方法:
1、设置指定帧位置作为起始点:
vc.Set(CapProp.PosFrames, 帧位置)
2、设置指定时间位置作为起始点:
vc.Set(CapProp.PosMsec, 时间位置)
【代码位置:frmChapter9_1】Button5_Click
'设置播放起始点
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Dim vc As New VideoCapture("C:\learnEmgucv\movie1.mp4")
vc.Set(CapProp.FrameWidth, 640)
vc.Set(CapProp.FrameHeight, 480)
Dim fps As Double = vc.Get(CapProp.Fps)
Console.WriteLine(vc.Get(CapProp.FrameCount))
If vc.IsOpened = False Then
Exit Sub
End If
Dim framecount As Long = vc.Get(CapProp.FrameCount)
Dim i As Long = 0
'以下两种方式选其一:
'==1、设置要播放的起始帧的位置
Dim frameIndex As Integer = 50
vc.Set(CapProp.PosFrames, frameIndex)
'==2、设置要播放的事件点的位置,注意Set()的第二个参数是毫秒
'Dim frameTime As Double = 3.0
'vc.Set(CapProp.PosMsec, frameTime * 1000)
Dim m As Mat = New Mat()
While True
'读取视频帧图像,使用Read
vc.Read(m)
If IsNothing(m) Then
Exit While
End If
If m.IsEmpty Then
Exit While
End If
CvInvoke.Imshow("video", m) ' 显示图像
CvInvoke.WaitKey(1000 / fps) ' 等待按键
End While
CvInvoke.DestroyWindow("video")
vc.Dispose()
Label1.Text = "播放结束"
End Sub
事实上,当获得视频帧图像后,就可以对这个图像进行处理,再显示处理的结果。
【代码位置:frmChapter9_1】Button6_Click
'简单示例处理图像后输出视频
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
Dim vc As New VideoCapture("C:\learnEmgucv\movie1.mp4")
Dim fps As Double = vc.Get(CapProp.Fps)
If vc.IsOpened = False Then
Exit Sub
End If
Dim framecount As Long = vc.Get(CapProp.FrameCount)
Dim i As Long = 0
Dim m As Mat = New Mat()
While True
vc.Read(m)
If IsNothing(m) Then
Exit While
End If
If m.IsEmpty Then
Exit While
End If
'这里使用canny简单示例处理图像
Dim mcanny As New Mat
CvInvoke.Canny(m, mcanny, 100, 250, 3)
CvInvoke.Imshow("video", mcanny) ' 显示图像
CvInvoke.WaitKey(1000 / fps) ' 等待按键
End While
CvInvoke.DestroyWindow("video")
vc.Dispose()
Label1.Text = "播放结束"
End Sub
输出结果如下图所示:

图9-2 处理视频帧并播放
9.1.4 Start、Stop和Pause方法
在EmguCV中,videocapture类提供了Start、Stop、Pause等方法,用于控制视频的播放和暂停。
Start方法:开始播放视频,实际是启动grab到一个指定线程。该方法并不会立即开始播放视频,而是会将视频设置为播放状态,此时将会触发ImageGrabbed事件。
Stop方法:停止播放视频,实际是停止grabbing线程。
Pause方法:暂停播放视频,实际是暂停正在运行的grab线程。该方法并不会立即暂停视频播放,而是会将视频设置为暂停状态。在Pause方法调用后,可以使用read或Grab方法读取视频帧进行处理,但是读取的视频帧是暂停状态下的帧图像,而不是实时的帧图像。
上述三个方法的使用,请参看9.1.5节【ImageGrabbed事件】的示例代码。
9.1.5 ImageGrabbed事件
ImageGrabbed事件会在每一帧图像数据被抓取时触发。使用该事件可以实现对视频流的实时处理。需要注意的是,1、ImageGrabbed事件实际已经是在进行Grab,所以,如果使用Retrieve方法获得图像,可以不使用Grab方法;2、由于ImageGrabbed事件是在后台线程中执行的,因此在事件处理方法中不能直接访问窗体或控件的属性。
【代码位置:frmChapter9_1】frmChapter9_Load、Button7_Click、vc1_ImageGrabbed、Button8_Click、Button9_Click
Dim vc1 As VideoCapture
'帧率
Dim fps As Double = 0
Private Sub frmChapter9_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'不检查跨线程
Me.CheckForIllegalCrossThreadCalls = False
End Sub
'调用VideoCapture的ImageGrabbed事件
Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
vc1 = New VideoCapture("C:\learnEmgucv\movie1.mp4")
If vc1.IsOpened = False Then
MessageBox.Show("打开文件失败")
Exit Sub
End If
'获得帧率
fps = vc1.Get(CapProp.Fps)
'添加ImageGrabbed事件
AddHandler vc1.ImageGrabbed, AddressOf vc1_ImageGrabbed
'启动
vc1.Start()
End Sub
'ImageGrabbed事件,这里面进行播放
Private Sub vc1_ImageGrabbed(sender As Object, e As EventArgs)
Dim nextframe As New Mat
'如果使用Retrieve,那么需要检查视频当前播放的位置
vc1.Retrieve(nextframe)
'判断是否到达视频结束帧
If vc1.Get(CapProp.PosFrames) >= vc1.Get(CapProp.FrameCount) Then
'停止
vc1.Stop()
'释放资源
vc1.Dispose()
'取消事件
RemoveHandler vc1.ImageGrabbed, AddressOf vc1_ImageGrabbed
'需要跨线程
Label1.Text = "播放结束"
Exit Sub
End If
'如果使用read,只需要检查该方法的返回值
'If vc1.Read(nextframe) = False Then
' '停止
' vc1.Stop()
' '释放资源
' vc1.Dispose()
' '取消事件
' RemoveHandler vc1.ImageGrabbed, AddressOf vc1_ImageGrabbed
' '需要跨线程
' Label1.Text = "播放结束"
' Exit Sub
'End If
ImageBox1.Image = nextframe
Threading.Thread.Sleep(1000 / fps)
End Sub
'暂停
Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
vc1.Pause()
End Sub
'停止
Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
vc2.Stop()
End Sub
以下代码模拟了电影中常用的扣除绿幕。
【代码位置:frmChapter9_1】Button10_Click、vc2_ImageGrabbed
Dim vc2 As VideoCapture
Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
vc2 = New VideoCapture("C:\learnEmgucv\前景.wmv")
If vc2.IsOpened = False Then
MessageBox.Show("打开文件失败")
Exit Sub
End If
fps = vc2.Get(CapProp.Fps)
AddHandler vc2.ImageGrabbed, AddressOf vc2_ImageGrabbed
vc2.Start()
End Sub
'模拟绿幕
Private Sub vc2_ImageGrabbed(sender As Object, e As EventArgs)
Dim nextframe As New Mat
'这里是对视频文件进行检查,所以使用read,同时检查是否播放完毕
If vc2.Read(nextframe) = False Then
vc2.Stop()
vc2.Dispose()
RemoveHandler vc2.ImageGrabbed, AddressOf vc2_ImageGrabbed
'跨线程了
Label1.Text = "播放结束"
Exit Sub
End If
Dim mhsv As New Mat
CvInvoke.CvtColor(nextframe, mhsv, ColorConversion.Rgb2Hsv)
Dim lower As New ScalarArray(New MCvScalar(35, 43, 46))
Dim upper As New ScalarArray(New MCvScalar(77, 255, 255))
'提取图像中某个颜色范围内的像素
'颜色值在范围内,则将其设置为白色(255),否则将其设置为黑色(0)
Dim mmask As New Mat
CvInvoke.InRange(mhsv, lower, upper, mmask)
'根据实际需要判断是否反转颜色
Dim mreversalmask As New Mat
mreversalmask = Not mmask
'以下代码输出二值图作为mask的彩色图,也就是原图去除了绿色背景
Dim m3channel As New Mat
CvInvoke.CvtColor(mreversalmask, m3channel, ColorConversion.Gray2Bgr)
Dim mout As New Mat
CvInvoke.BitwiseAnd(nextframe, m3channel, mout)
Threading.Thread.Sleep(1000 / fps)
ImageBox1.Image = mout
End Sub
输出结果如下图所示:

图9-3 模拟去除绿幕
相关文章:
EmguCV学习笔记 VB.Net 9.1 VideoCapture类
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…...
Rspack 1.0 发布了!
文章来源|Rspack Team 项目地址|https://github.com/web-infra-dev/rspack Rspack 是基于 Rust 编写的下一代 JavaScript 打包工具, 兼容 webpack 的 API 和生态,并提供 10 倍于 webpack 的构建性能。 在 18 个月前,我…...
【全网最全】2024年数学建模国赛E题超详细保奖思路+可视化图表+成品论文+matlab/python代码等(后续会更新
您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年数学建模国赛E题成品论文超详细保奖思路可视化图表matlab/python代码等(后续会更新「首先来看看目前已有的资料,还…...
数智转型,看JNPF如何成为企业的必备工具
随着数字化转型的浪潮席卷全球,企业面临着前所未有的挑战与机遇。在这一过程中,低代码开发平台作为一种创新的软件开发方式,正逐渐成为企业实现快速迭代和敏捷开发的关键工具。JNPF作为一款领先的低代码开发平台,凭借其强大的功能…...
ArcGIS Pro 发布松散型切片
使用ArcGIS Pro发布松散型切片问题,有时候会出现切片方案写了松散型,但是自动切片完成后依然是紧凑型的问题,这时候可以采用手动修改然后再切片的方式。 1. 发布切片服务 选择手动切片方式 2. 手动修改服务的切片方案文件 修改cache服务…...
奖项再+1!通义灵码智能编码助手通过可信 AI 智能编码工具评估,获当前最高等级
阿里云的通义灵码智能编码助手参与中国信通院组织的可信AI智能编码工具首轮评估,最终获得 4 级评级,成为国内首批通过该项评估并获得当前最高评级的企业之一。 此次评估以《智能化软件工程技术和应用要求 第 2 部分:智能开发能力》为依据&…...
如何使用 yum 在 CentOS 6 上安装 nginx
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 状态 状态: 已弃用 本文涵盖的 CentOS 版本已不再受支持。如果您目前正在运行 CentOS 6 服务器,我们强烈建议升…...
F12抓包05:Network接口测试(抓包篡改请求)
课程大纲 使用线上接口测试网站演示操作,浏览器F12检查工具如何进行简单的接口测试:抓包、复制请求、篡改数据、发送新请求。 测试地址:https://httpbin.org/forms/post ① 抓包:鼠标右键打开“检查”工具(F12…...
OPenCV结构分析与形状描述符(4)计算一个旋转矩形的四个顶点的函数boxPoints()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 找到一个旋转矩形的四个顶点。对于绘制旋转矩形很有用。 该函数找到一个旋转矩形的四个顶点。这个函数对于绘制矩形很有帮助。在C中,…...
【Matplotlib】利用Python进行绘图!(python数据分析与可视化)
文章开始前打个小广告——分享一份Python学习大礼包(激活码安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程)点击领取,100%免费! 【Matplotlib】 教程&…...
第二百二十节 JPA教程 - JPA 实体管理器删除示例
JPA教程 - JPA 实体管理器删除示例 我们可以使用JPA中的EntityManager来删除一个实体。 在下面的代码中,我们首先通过使用EntityManager中的find方法从数据库获取person对象,然后调用remove方法并传递person对象引用。 Person emp em.find(Person.cla…...
[TypeError] {message: “Cannot read property ‘‘ of undefined“}
11:11:25.500 [TypeError] {message: “Cannot read property ‘’ of undefined”} 11:11:25.586 [Vue warn]: Unhandled error during execution of render function \n at \nat \nat \nat \nat \nat \nat <V uniapp 使用报错 解决方法 页面加 v-if 来判断这个字…...
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001
由于需要对NFI进行汉化,以及二次开发,首先要下载源码以后编辑通过,NIFI的源码,项目非常多,编译过程中需要编译超过570个jar包,同时编译过程很慢需要30多分钟. 1.首先下载NIFI源码,根据需要下载对应版本: https://github.com/kemixkoo/orchsym-runtime/ 首先介绍一下,这个是一…...
项目在运行时,浏览器控制台出现 Uncaught ReferenceError: globalThis is not defined
项目场景: 背景: 项目在运行时,QQ浏览器控制台出现 Uncaught ReferenceError: globalThis is not defined … 错误信息 问题描述 问题: 错误信息如下所示: Uncaught ReferenceError: globalThis is not definedat r…...
图中点的层次
给定一个 nn 个点 mm 条边的有向图,图中可能存在重边和自环。 所有边的长度都是 11,点的编号为 1∼n1∼n。 请你求出 11 号点到 nn 号点的最短距离,如果从 11 号点无法走到 nn 号点,输出 −1−1。 输入格式 第一行包含两个整数…...
ansible+awx搭建
1、环境介绍 操作系统版本:龙蜥os 8.9 docker 版本:26.0.2 python版本:3.11.9 ansible版本:2.16.6 awx版本:24.2.0 2、安装docker 设置软件源 yum install -y yum-utilsyum-config-manager \--add-repo \https://mirr…...
linux环境下安装配置go环境
概述 摘要: 本文介绍在linux环境下,安装go环境的方法 安装步骤 1,下载go安装包 根据需要下载linux环境下的go版本包,本文以go1.17.3版本为例 wget https://storage.googleapis.com/golang/go1.17.3.linux-amd64.tar.gz 2,解压 …...
可交互、会学习、自成长机器人——李德毅院士
在以“农业无人农场”为主题的中国工程科技论坛上,中国工程院院士、欧亚科学院院士、中国人工智能学会和中国指挥与控制学会名誉理事长,中科原动力首席科学家李德毅院士应邀做题为《机器具身交互智能》的演讲。李德毅院士表示,智能机器不但把…...
Redis发布订阅PUB/SUB
Redis发布订阅PUB/SUB是一种消息通信模式,发送者PUB发送消息,订阅者SUB接收消息。Redis客户端可以订阅任意数量的频道,一个通道CHANNEL可以被多个客户端订阅,当一条消息发送到CHANNEL中去后所有订阅的客户端都会接收到此消息。 一…...
Scratch教师节 —— 感恩教师节
小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! Scratch教师节动画作品——感恩教师节 在这个特别的日子里,我们迎来了教师节。为了表达对老师们的感激之情,Scratch平台上的小朋友们用创意与热情制作了精彩的动画作品——“感恩教师节”。…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
GAN模式奔溃的探讨论文综述(一)
简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...
Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...
ABAP设计模式之---“Tell, Don’t Ask原则”
“Tell, Don’t Ask”是一种重要的面向对象编程设计原则,它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则? 这个原则的核心思想是: “告诉一个对象该做什么,而不是询问一个对象的状态再对它作出决策。…...
SE(Secure Element)加密芯片与MCU协同工作的典型流程
以下是SE(Secure Element)加密芯片与MCU协同工作的典型流程,综合安全认证、数据保护及防篡改机制: 一、基础认证流程(参数保护方案) 密钥预置 SE芯片与MCU分别预置相同的3DES密钥(Key1、Key2…...
