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)

  1. camIndex:要打开的摄像头的编号,例如0表示打开第一个摄像头
  2. captureApi:指定videocapture对象使用的视频捕获API,这是一个VideoCapture.API枚举,Windows下常用的成员有:
    1. Any:自动选择最佳的视频捕获API
    2. DShow:使用DirectShow视频捕获API。
    3. Vfw:使用Video for Windows视频捕获API。
    4. Ffmpeg:使用FFmpeg视频捕获API,但是需要安装相应的FFmpeg库。

2、Public Sub New (fileName As String, Optional captureApi As VideoCapture. API = VideoCapture.API.Any)

  1. fileName:要打开的视频文件路径或网络流地址。
  2. 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,可以使用RTSPHTTPFTPMMS等网络视频协议

        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 RetrieveReadQueryframe方法

这三种方法都是从视频中获得一幅图像。但是各有区别。

1、Retrieve不能自动读取下一帧,需要与Grab方法一起使用。而Grab方法只是获取下一帧的数据到一个用户无法访问的内存区,然后使用Retrieve方法根据通道号进行编码读取相应的图像。Read和Queryframe方法取出图像后可以自动转到下一帧图像

2、Retrieve可以返回多通道图像,比如使用立体摄像机,每一帧会返回两个图像;而Kinect会返回四个图像。Read和Queryframe方法不能读取多通道图像。

3、三种方法读取完视频(文件)最后一帧,返回的状态(详细请看示例代码):

  1. QueryFrame:IsNothing(m)=True(其中m为获得的Mat对象,下同),读取时,m所指向的数据指针DataPointer会变。
  2. Read:IsNothing(m)=False,m.IsEmpty=True,读取时,m所指向的数据指针DataPointer不会变。
  3. 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 StartStopPause方法

在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

    '调用VideoCaptureImageGrabbed事件

    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 模拟去除绿幕

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

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

相关文章

编译LineageOS模拟器镜像,导出到AndroidStudio

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 源码下载 LineageOS官网:https://lineageos.org/ LineageOS源码 github 地址:https://github.com/LineageOS/android LineageOS源码国…

编写一个每次随机生成 10个 0(包括) 到 100 之间的随机正整数。

编写一个每次随机生成 10个 0(包括) 到 100 之间的随机正整数。 package cn.itcast.example;import java.util.Iterator; import java.util.Random; public class example {public static void main (String[] arge) {System.out.println("Math.ra…

QNN:基于QNN+example重构之后的yolov8det部署

QNN是高通发布的神经网络推理引擎,是SNPE的升级版,其主要功能是: 完成从Pytorch/TensorFlow/Keras/Onnx等神经网络框架到高通计算平台的模型转换; 完成模型的低比特量化(int8),使其能够运行在高…

超长二进制利用Integer转换

1.Integer缺点 目前测试Integer只能一次性转4*7位二进制数,也就是7位16进制,故进行改进 2.改进 操作:每四位二进制一转换,以免到上限报错 注解格式:序号(代码顺序)解释 public class Main {…

《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(2)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(1) 7.1 数据链路层的组成结构 数据链路层使用ACK/NAK协议发送和接收TLP,由发送部件和接收部件组成。其中,发送部件由…

Springboot里集成Mybatis-plus、ClickHouse

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 Springboot里集成Mybati…

基于Java+SpringBoot+Vue的汽车销售网站

基于JavaSpringBootVue的汽车销售网站 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅 某信 gzh 搜索【智能编程小助手】获取项…

【大模型】llama系列模型基础

前言:llama基于transformer架构,与GPT相似,只用了transformer的解码器部分。本文主要是关于llama,llama2和llama3的结构解读。 目录 1. llama1.1 整体结构1.2 RoPE1.3 SwiGLU 激活函数 2. llama22.2 GQA架构2.3 RLHF 3. llama3参考…

Springboot中使用Elasticsearch(部署+使用+讲解 最完整)

目录 引言 一、docker中安装Elasticsearch 1、创建es专有的网络 2、开放端口 3、在es-net网络上安装es和kibana 4、可能出现的问题 5、测试 6、安装IK分词器 7、测试IK分词器 二、结合业务实战 1、准备依赖 2、配置yml 3、读取yml配置 4、准备es配置类 5、编写测…

Leetcode面试经典150题-136.只出现一次的数字

解法都在代码里,不懂就留言或者私信 这个题不知道为啥会考,过于简单了,我解题写注释用了两分钟不到,5行代码。。。 class Solution {public int singleNumber(int[] nums) {/**这个题目确实时间的题,根据位运算法则我…

斗破C++编程入门系列之十九:C++程序设计必知:多文件结构和编译预处理命令(九星斗者)

斗破C目录: 斗破C编程入门系列之前言(斗之气三段) 斗破C编程入门系列之二:Qt的使用介绍(斗之气三段) 斗破C编程入门系列之三:数据结构(斗之气三段) 斗破C编程入门系列之…

ctfshow之web55~web57(无字母的rce)

目录 web55 思路一: 思路二: web56 web57 本系列主要针对无字母rce或无字母无数字rce 声明:本章内容是引荐几位师傅的博客,然后根据自己的理解编写而成。 web55 if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/\…

乐凡三防:工业界的硬核产品——重新定义三防平板的极限

在工业4.0的浪潮中,科技与制造业的深度融合催生了一系列高性能、高耐用的智能产品。乐凡三防平板,作为工业界的新宠,正以其卓越的防护性能和强大的功能,重新定义了三防平板的极限,成为硬核科技的代表。 硬核防护&#…

GD32F4xx---RTC初始化设置及闹钟方式实现秒中断讲解

GD32F4xx—RTC初始化设置及闹钟方式实现秒中断讲解 1、下载链接:源码工程 一、概述 GD32F4x的RTC例程网上资源较少,详细阅读用户手册后做出如下配置。RTC模块提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码显示外,时间和日期都以BC…

大连网站建设手机网页页面设计

在现代社会,随着智能手机的普及,越来越多的用户选择通过手机访问网站,这使得移动端网页设计的重要性日益凸显。大连作为一个经济和文化中心,网站建设行业也在不断发展。针对大连的网站建设,手机网页页面设计需要特别注…

内存管理篇-16二级页表工作原理

1.修正上节课的转换图 上节课的页表的一级页表其实并不完全正确,一般虚拟页帧和物理页帧号不会都占用实际字段,这样毕竟很浪费内存。 2.再分析一下页表的开销情况: 一级页表:以4KB物理页为映射单位,每个进程4MB的虚…

动态读取nacos中修改的项目配置文件

本项目用的还是springboot项目,咱们直接上代码 一:首先看下nacos中需要动态获取的属性 二:把需要动态读取的配置类中的属性整理一个实体类 mport lombok.Data; import org.springframework.boot.context.properties.ConfigurationPropert…

Python酷库之旅-第三方库Pandas(114)

目录 一、用法精讲 501、pandas.DataFrame.mode方法 501-1、语法 501-2、参数 501-3、功能 501-4、返回值 501-5、说明 501-6、用法 501-6-1、数据准备 501-6-2、代码示例 501-6-3、结果输出 502、pandas.DataFrame.pct_change方法 502-1、语法 502-2、参数 502…

Django 第十一课 -- ORM - 多表实例

目录 一. 前言 二. 创建模型 三. 插入数据 四. ORM - 添加数据 4.1. 一对多(外键 ForeignKey) 4.2. 多对多(ManyToManyField):在第三张关系表中新增数据 4.3. 关联管理器(对象调用) 五. ORM 查询 5.1. 一对多 5.2. 一对一 5.3. 多对多 六. 基于双下划线…

SprinBoot+Vue实验室考勤管理小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…