OpenCV-Python实战(2)——图像与视频文件的处理_pythonopencv处理视频

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

ret, frame = capture.read()

if ret is True:
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 保存相机画面
    if cv2.waitKey(20) & 0xFF == ord('c'):
        frame_name = "camera\_frame\_{}.png".format(frame_index)
        gray_frame_name = "grayscale\_camera\_frame\_{}.png".format(frame_index)
        # 将当前帧保存到磁盘(同时保存 BGR 和灰度帧)
        cv2.imwrite(frame_name, frame)
        cv2.imwrite(gray_frame_name, gray_frame)
        frame_index += 1
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break
else:
    break

capture.release()
cv2.destroyAllWindows()


当按下 `c` 键时,首先构造两个文件名;然后,将两个图像保存到磁盘;最后,`frame_index` 递增,以便为保存下一帧做好准备。


#### 3.4 读取视频文件


`cv2.VideoCapture` 也可以用于读取视频文件,要读取视频文件,应在创建 `cv2.VideoCapture` 对象时提供视频文件的路径,编写 `read_video_file.py` 脚本:



import cv2
import argparse

parser = argparse.ArgumentParser()
parser.add_argument(“video_path”, help=“path to the video file”)
args = parser.parse_args()
capture = cv2.VideoCapture(args.video_path)
if capture.isOpened() is False:
print(“Error opening the video file!”)

while capture.isOpened():
ret, frame = capture.read()
if ret is True:
cv2.imshow(‘Original frame from the video file’, frame)
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow(‘Grayscale frame’, gray_frame)
if cv2.waitKey(20) & 0xFF == ord(‘q’):
break
else:
break
capture.release()
cv2.destroyAllWindows()


通过在命令行中执行以下命令,运行脚本:



python read_video_file.py xinlingqilv.mp4


可以看到运行结果开始播放视频文件:


![播放视频文件](https://img-blog.csdnimg.cn/2395e7c69039409999a2eb129e24504c.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


#### 3.5 读取 IP 摄像机


`cv2.VideoCapture` 也可以从 IP 摄像头读取数据。在 OpenCV 中从 IP 摄像头读取数据与从文件读取数据非常相似。唯一需要修改的是提供给 `cv2.VideoCapture` 构造函数的参数。可以使用本地网络中的 IP 摄像机或尝试连接公共 IP 摄像机。


### 4. 保存视频文件


接下来,首先介绍与视频相关的基本概念(例如,fps、编解码器和视频文件格式等),然后将了解如何使用 `cv2.VideoWriter` 保存视频文件。


#### 4.1 计算帧率(FPS)


`FPS` 是计算机视觉项目中的一个重要指标,该指标表示每秒处理的帧(画面)数,`FPS` 越高越好。但是,算法每秒应处理的帧数将取决于需要解决的特定问题。例如,如果算法需要跟踪和检测在街上行走的人,那么 15 FPS 可能就足够了。但是,如果是检测和跟踪高速公路上快速行驶的汽车,则可能需要 20-25 FPS。  
 因此,计算计算机视觉项目中的 FPS 指标非常重要。编写 `read_camera_fps.py` 以输出 `FPS`:



import cv2
import argparse
import time

capture = cv2.VideoCapture(0)

if capture.isOpened() is False:
print(“Error opening the camera”)

while capture.isOpened():
ret, frame = capture.read()
if ret is True:
processing_start = time.time()
cv2.imshow(“Input frame from the camera”, frame)
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow(‘Grayscale input camera’, gray_frame)
if cv2.waitKey(20) & 0xFF == ord(‘q’):
break
processing_end = time.time()
processing_time_frame = processing_end - processing_start
print(“FPS: {}”.format(1.0 / processing_time_frame))
else:
break

capture.release()
cv2.destroyAllWindows()


在上述示例脚本中,首先需要获取处理开始的时间:



processing_start = time.time()


然后,获取所有处理完成后的时间:



processing_end = time.time()


接下来,计算时间差:



processing_time_frame = processing_end - processing_start


最后,计算并打印 FPS:



print(“FPS: {}”.format(1.0 / processing_time_frame))


#### 4.2 写入视频文件的流程


视频编码是一种用于压缩和解压缩数字视频的程序。具体而言,编解码器可用于将未压缩的视频转换为压缩后的视频,或者可用于将压缩的视频转换为未压缩的视频。压缩视频格式通常遵循视频压缩规范或视频编码格式的标准规范。OpenCV 提供了 `FOURCC` (一个 4 字节编码),用于指定视频编解码器,查看[可用编码列表]( )获取更多可用编码。应该注意的是:支持的编解码器是平台相关的,如果想使用特定的编解码器,则应该在系统上安装该编解码器。典型的编解码器包括 DIVX、XVID、X264 和 MJPG。  
 视频文件格式是一种用于存储数字视频数据的文件格式,典型的视频文件格式包括 AVI(\*.avi)、MP4(\*.mp4)、QuickTime(\*.mov) 和 Windows Media Video(\*.wmv)。  
 最后,应该考虑到视频文件格式和 FOURCC 之间需要进行正确的组合。 在 OpenCV 中创建视频文件时,必须考虑这些因素:


![写入视频文件的流程](https://img-blog.csdnimg.cn/707790556f244a72ac2aca508f37c610.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


上图总结了在 OpenCV 中使用 `cv2.VideoWriter()` 创建视频文件时应考虑的主要因素。在创建的名为 `video_example.avi` 视频中,FOURCC 值为 XVID,视频文件格式为 AVI(\*.avi),同时最后,应设置视频每一帧的 FPS 和尺寸。  
 脚本 `write_video_file.py` 演示如何创建视频文件:



Import required packages

import cv2
import argparse

parser = argparse.ArgumentParser()

parser.add_argument(“output_video_path”, help=“path to the video file to write”)
args = parser.parse_args()

capture = cv2.VideoCapture(0)

frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)

fourcc = cv2.VideoWriter_fourcc(*‘XVID’)

out_gray = cv2.VideoWriter(args.output_video_path, fourcc, int(fps), (int(frame_width), int(frame_height)), False)

while capture.isOpened():
ret, frame = capture.read()
if ret:
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
out_gray.write(gray_frame)

    cv2.imshow('gray', gray_frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
else:
    break

capture.release()
out_gray.release()
cv2.destroyAllWindows()


在上例中,必需的参数是输出视频文件名(例如 video\_example.avi):



parser = argparse.ArgumentParser()
parser.add_argument(“output_video_path”, help=“path to the video file to write”)
args = parser.parse_args()


从连接到计算机的第一台相机拍摄视频画面。因此,首先创建对象:



capture = cv2.VideoCapture(0)


接下来,从 `capture` 对象中获取一些关键属性(帧宽度、帧高度和 FPS),用于创建视频文件时使用:



frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)


然后,使用四字节编码 `FOURCC` 指定视频编解码器,此处将编解码器定义为 XVID :



fourcc = cv2.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’)


也可以使用以下方式指定视频编码器:



fourcc = cv2.VideoWriter_fourcc(*‘XVID’)


然后,使用与输入相机相同的属性创建 `cv2.VideoWriter` 对象 `out_gray`,`cv2.VideoWriter` 的最后一个参数值是 False 表示以灰度方式写入视频。如果我们想创建彩色视频,最后一个参数值为 True :



out_gray = cv2.VideoWriter(args.output_video_path, fourcc, int(fps), (int(frame_width), int(frame_height)), False)


使用 `capture.read()` 从 `catpure` 对象获取相机帧,每一帧都被转换成灰度并写入视频文件,如果按下 `q` 键,程序结束:



while capture.isOpened():
ret, frame = capture.read()
if ret:
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
out_gray.write(gray_frame)
cv2.imshow(‘gray’, gray_frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
else:
    break

最后,释放所有内容(包括 `cv2.VideoCapture` 和 `cv2.VideWriter` 对象,并销毁创建的窗口):



capture.release()
out_gray.release()
cv2.destroyAllWindows()


通过在命令行中执行以下命令,运行脚本:



python write_video_file.py video_example.avi


在工作目录下可以看到保存的灰度视频文件。


### 5. 视频属性详解


在上述示例中,我们已经了解了如何从 `cv2.VideoCapture` 对象中获取一些关键属性。接下来,将介绍所有属性并了解它们的工作原理。最后,我们将使用这些属性来加载视频文件并反向输出(首先显示视频的最后一帧,依此类推)。


#### 5.1 获取视频对象的属性


创建 `read_video_file_all_properties.py` 脚本来显示所有属性。其中一些属性仅在使用相机时才有效(而在视频文件时无效)。  
 在脚本中,首先创建 `decode_fourcc()` 函数,它将 `capture.get(cv2.CAP_PROP_FOURCC)` 返回的 `int` 类型的值转换为表示编解码器的字符串值,来正确输出编解码器:



def decode_fourcc(fourcc):
fourcc_int = int(fourcc)

print("int value of fourcc: '{}'".format(fourcc_int))

fourcc_decode = ""
for i in range(4):
    int_value = fourcc_int >> 8 \* i & 0xFF
    print("int\_value: '{}'".format(int_value))
    fourcc_decode += chr(int_value)

return fourcc_decode

下图解释了函数 `decode_fourcc` 的工作原理:


![视频对象的属性](https://img-blog.csdnimg.cn/8d4049fa6d314d76b41950f5d3f08372.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xPVkVteTEzNDYxMQ==,size_16,color_FFFFFF,t_70#pic_center)


第一步是获取由 capture.get(cv2.CAP\_PROP\_FOURCC) 返回的值( int 表示的字符串),然后,迭代四次,每次获取八位并将这八位转换为 int 。最后,使用 chr() 函数将这些 int 值转换为 char。也可以只使用一行代码就可以完成此功能:



return “”.join([chr((fourcc_int >> 8 * i) & 0xFF) for i in range(4)])


下表显示了视频文件的主要属性和解释:




| 视频属性 | 解释 |
| --- | --- |
| CAP\_PROP\_POS\_FRAMES | 视频文件的当前帧 |
| CAP\_PROP\_POS\_MSEC | 当前帧的时间戳 |
| CAP\_PROP\_FPS | 获取 FPS |
| CAP\_PROP\_FRAME\_WODTH | 视频帧的宽度 |
| CAP\_PROP\_FRAME\_HEIGHT | 视频帧的高度 |
| CAP\_PROP\_FRAME\_COUNT | 视频文件的总帧数 |


使用以下代码,可以获取和打印所有属性:



print(“CV_CAP_PROP_FRAME_WIDTH:‘{}’”.format(capture.get(cv2.CAP_PROP_FRAME_WIDTH)))
print(“CV_CAP_PROP_FRAME_HEIGHT :‘{}’”.format(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print(“CAP_PROP_FPS : ‘{}’”.format(capture.get(cv2.CAP_PROP_FPS)))
print(“CAP_PROP_POS_MSEC :‘{}’”.format(capture.get(cv2.CAP_PROP_POS_MSEC)))
print(“CAP_PROP_POS_FRAMES :‘{}’”.format(capture.get(cv2.CAP_PROP_POS_FRAMES)))
print(“CAP_PROP_FOURCC :‘{}’”.format(decode_fourcc(capture.get(cv2.CAP_PROP_FOURCC))))
print(“CAP_PROP_FRAME_COUNT :‘{}’”.format(capture.get(cv2.CAP_PROP_FRAME_COUNT)))
print(“CAP_PROP_MODE : ‘{}’”.format(capture.get(cv2.CAP_PROP_MODE)))
print(“CAP_PROP_BRIGHTNESS :‘{}’”.format(capture.get(cv2.CAP_PROP_BRIGHTNESS)))
print(“CAP_PROP_CONTRAST :‘{}’”.format(capture.get(cv2.CAP_PROP_CONTRAST)))
print(“CAP_PROP_SATURATION :‘{}’”.format(capture.get(cv2.CAP_PROP_SATURATION)))
print(“CAP_PROP_HUE : ‘{}’”.format(capture.get(cv2.CAP_PROP_HUE)))
print(“CAP_PROP_GAIN : ‘{}’”.format(capture.get(cv2.CAP_PROP_GAIN)))
print(“CAP_PROP_EXPOSURE :‘{}’”.format(capture.get(cv2.CAP_PROP_EXPOSURE)))
print(“CAP_PROP_CONVERT_RGB :‘{}’”.format(capture.get(cv2.CAP_PROP_CONVERT_RGB)))
print(“CAP_PROP_RECTIFICATION :‘{}’”.format(capture.get(cv2.CAP_PROP_RECTIFICATION)))
print(“CAP_PROP_ISO_SPEED :‘{}’”.format(capture.get(cv2.CAP_PROP_ISO_SPEED)))
print(“CAP_PROP_BUFFERSIZE :‘{}’”.format(capture.get(cv2.CAP_PROP_BUFFERSIZE)))


#### 5.2 视频属性的使用——视频的反向播放


为例更好的了解如何使用上述属性,接下来,我们通过实战使用这些属性。编写 `read_video_file_backwards.py` 脚本,该脚本使用一些上述属性加载视频并反向播放(首先显示视频的最后一帧,然后播放倒数第二帧,依此类推),为了实现此目的,需要使用属性:`cv2.CAP_PROP_FRAME_COUNT` 和 `cv2.CAP_PROP_POS_FRAMES`。



import cv2
import argparse

parser = argparse.ArgumentParser()
parser.add_argument(“video_path”, help=‘path to the video fiel’)
args = parser.parse_args()

capture = cv2.VideoCapture(args.video_path)

if capture.isOpened() is False:
print(“Error opening vieo stream or file”)

frame_index = capture.get(cv2.CAP_PROP_FRAME_COUNT) - 1
print(“Starting in frame: ‘{}’”.format(frame_index))

while capture.isOpened() and frame_index >= 0:
capture.set(cv2.CAP_PROP_POS_FRAMES, frame_index)
ret, frame = capture.read()

if ret:
    cv2.imshow('Original frame', frame)
    frame_index = frame_index - 1
    print("next index to read: '{}'".format(frame_index))

    # Press q on keyboard to exit the program:
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break
# Break the loop
else:
    break

capture.release()
cv2.destroyAllWindows()


第一步是获取最后一帧的索引:



frame_index = capture.get(cv2.CAP_PROP_FRAME_COUNT) - 1


然后,将当前帧设置为所获取帧的位置:



capture.set(cv2.CAP_PROP_POS_FRAMES, frame_index)


这样,就可以像读取获取都帧了:



ret, frame = capture.read()


最后,索引值减一以从视频文件中读取下一帧:



frame_index = frame_index - 1


通过运行以下命令就可以看到反向播放的视频:



python read_video_file_backwards.py video_example.avi


![反向播放](https://img-blog.csdnimg.cn/3c2aae0b52394dad9f2e1016dc550198.gif#pic_center)


可以简单修改此脚本以保存反向播放的结果视频。



import cv2
import argparse

def decode_fourcc(fourcc):
fourcc_int = int(fourcc)
print(“int value of fourcc: ‘{}’”.format(fourcc_int))
fourcc_decode = “”
for i in range(4):
int_value = fourcc_int >> 8 * i & 0xFF
print(“int_value: ‘{}’”.format(int_value))
fourcc_decode += chr(int_value)
return fourcc_decode

parser = argparse.ArgumentParser()

添加 ‘video_path’ 参数用于输入视频文件名

parser.add_argument(“video_path”, help=“path to the video file”)

添加 ‘output_video_path’ 参数用于输出视频文件名

parser.add_argument(“output_video_path”, help=“path to the video file to write”)
args = parser.parse_args()

capture = cv2.VideoCapture(args.video_path)

获取 VideoCapture 属性

frame_width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)
frame_height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = capture.get(cv2.CAP_PROP_FPS)
codec = decode_fourcc(capture.get(cv2.CAP_PROP_FOURCC))

print(“codec: ‘{}’”.format(codec))

fourcc = cv2.VideoWriter_fourcc(*codec)

创建 VideoWriter 对象,使用与输入视频文件相同的属性

out = cv2.VideoWriter(args.output_video_path, fourcc, int(fps), (int(frame_width), int(frame_height)), True)

Check if camera opened successfully

if capture.isOpened() is False:
print(“Error opening video stream or file”)
frame_index = capture.get(cv2.CAP_PROP_FRAME_COUNT) - 1

while capture.isOpened() and frame_index >= 0:
capture.set(cv2.CAP_PROP_POS_FRAMES, frame_index)
ret, frame = capture.read()

if ret is True:
    # 显示处理结果帧
    cv2.imshow('Original frame', frame)
    # 将处理结果帧写入视频
    out.write(frame)
    frame_index = frame_index - 1
    # Press q on keyboard to exit the program:
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break
# Break the loop
else:
    break

Release everything:

capture.release()
out.release()
cv2.destroyAllWindows()


### 小结


计算机视觉项目中的常见信息流是先加载一些图像,进行处理,最后输出处理后的图像。因此,处理图像和文件是计算机视觉项目的关键要素。就视频流而言,主要类包括 `cv2.VideoCapture` 和 `cv2.VideoWriter`。在编写视频文件时,需要注意视频编解码器和视频文件格式间的匹配,典型的编解码器包括 DIVX、XVID、X264 和 MJPG,而典型的视频文件格式包括 AVI(\*.avi)、MP4(\*.mp4)、QuickTime(\*.mov) 和 Windows Media Video(\*.wmv)。  
 同时介绍了 FPS 的概念以及如何在程序中计算它。此外,展示了如何获取 cv2.VideoCapture 对象的所有属性,以及如何使用它们加载视频并反向播放。


### 系列链接


[OpenCV-Python实战(1)——OpenCV简介与图像处理基础]( )  
 [OpenCV-Python实战(3)——OpenCV中绘制图形与文本]( )  
 [OpenCV-Python实战(4)——OpenCV常见图像处理技术]( )  
 [OpenCV-Python实战(5)——OpenCV图像运算]( )  
 [OpenCV-Python实战(6)——OpenCV中的色彩空间和色彩映射]( )  
 [OpenCV-Python实战(7)——直方图详解]( )  
 [OpenCV-Python实战(8)——直方图均衡化]( )  
 [OpenCV-Python实战(9)——OpenCV用于图像分割的阈值技术]( )  
 [OpenCV-Python实战(10)——OpenCV轮廓检测]( )  
 [OpenCV-Python实战(11)——OpenCV轮廓检测相关应用]( )  
 [OpenCV-Python实战(12)——一文详解AR增强现实]( )  
 [OpenCV-Python实战(13)——OpenCV与机器学习的碰撞]( )  


### 如何自学黑客&网络安全


#### 黑客零基础入门学习路线&规划


**初级黑客**  
 **1、网络安全理论知识(2天)**  
 ①了解行业相关背景,前景,确定发展方向。  
 ②学习网络安全相关法律法规。  
 ③网络安全运营的概念。  
 ④等保简介、等保规定、流程和规范。(非常重要)


**2、渗透测试基础(一周)**  
 ①渗透测试的流程、分类、标准  
 ②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking  
 ③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察  
 ④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等


**3、操作系统基础(一周)**  
 ①Windows系统常见功能和命令  
 ②Kali Linux系统常见功能和命令  
 ③操作系统安全(系统入侵排查/系统加固基础)


**4、计算机网络基础(一周)**  
 ①计算机网络基础、协议和架构  
 ②网络通信原理、OSI模型、数据转发流程  
 ③常见协议解析(HTTP、TCP/IP、ARP等)  
 ④网络攻击技术与网络安全防御技术  
 ⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现


**5、数据库基础操作(2天)**  
 ①数据库基础  
 ②SQL语言基础  
 ③数据库安全加固


**6、Web渗透(1周)**  
 ①HTML、CSS和JavaScript简介  
 ②OWASP Top10  
 ③Web漏洞扫描工具  
 ④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)  
 恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k


到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?


如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!


**7、脚本编程(初级/中级/高级)**  
 在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.


如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。

**8、超级黑客**  
 这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。  
 ![img](https://img-blog.csdnimg.cn/img_convert/3fd39c2ba8ec22649979f245f4221608.webp?x-oss-process=image/format,png)


#### 网络安全工程师企业级学习路线


![img](https://img-blog.csdnimg.cn/img_convert/931ac5ac21a22d230645ccf767358997.webp?x-oss-process=image/format,png)  
 如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的


视频配套资料&国内外网安书籍、文档&工具


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

![img](https://img-blog.csdnimg.cn/img_convert/153b2778a3fe5198265bed9635d63469.webp?x-oss-process=image/format,png)  
 一些笔者自己买的、其他平台白嫖不到的视频教程。  
 ![img](https://img-blog.csdnimg.cn/img_convert/32eb4b22aa740233c5198d3c161b37e8.webp?x-oss-process=image/format,png)





**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
![img](https://img-blog.csdnimg.cn/img_convert/20e264e78df741f77571e416dfabdb1b.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

8997.webp?x-oss-process=image/format,png)  
 如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的


视频配套资料&国内外网安书籍、文档&工具


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

![img](https://img-blog.csdnimg.cn/img_convert/153b2778a3fe5198265bed9635d63469.webp?x-oss-process=image/format,png)  
 一些笔者自己买的、其他平台白嫖不到的视频教程。  
 ![img](https://img-blog.csdnimg.cn/img_convert/32eb4b22aa740233c5198d3c161b37e8.webp?x-oss-process=image/format,png)





**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
[外链图片转存中...(img-FKK8Z6HD-1713362762549)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值