Opencv第十一章——视频处理

news2024/12/24 2:54:16

1. 读取并显示摄像头视频

1.1 VideoCapture类

VideoCapture类提供了构造方法VideoCapture(),用于完成摄像头的初始化工作,其语法格式如下:

capture = cv2.VideoCapture(index)

参数说明:

capture:要打开的摄像头视频。

index:摄像头设备索引。

对于Win11而言,index=0时表示要打开笔记本内置摄像头。

capture = cv2.VideoCapture(0)

 对于Win11而言,index=1时表示要打开连接笔记本的外置摄像头。

capture = cv2.VideoCapture(1)

 为了检验摄像头初始化是否成功,VIdeoCapture类提供了isOpened()方法,其语法格式如下

retaval = cv2.VideoCapture.isOpened()

参数说明:

retval:若初始化成功,则值为True,否则值为False.。

retaval = cv2.VideoCapture.isOpened()
# retval = capture.isOpened()

 摄像头初始化后,就可以从摄像头中读取帧了,VideoCapture类提供了read()方法,其语法格式如下:

retval,image = cv2.VideoCapture.read() #可以简写为retval, image = capture.read()

参数说明:

retval:读取到帧,则返回True,反之,则返回False。

image:读取到的帧,即图像。

retval,image = cv2.VideoCapture.read() 
#retval, image = capture.read()

VideoCapture类提供了release()方法 关闭摄像头。

cv2.VideoCapture.release()
#capture.release()

1.2 如何使用VideoCapture类

1.2.1 读取并显示摄像头视频

 操作示例代码:

import cv2

capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)  # 打开笔记本内置摄像头
while capture.isOpened():  # 笔记本内置摄像头被打开后
    retval, image = capture.read()  # 从摄像头中实时读取视频
    cv2.imshow("Video", image)  # 在窗口中显示读取到的视频
    key = cv2.waitKey(1)  # 窗口的图像刷新时间为1毫秒
    if key == 32:  # 如果按下空格键
        break
capture.release()  # 关闭笔记本内置摄像头
cv2.destroyAllWindows()  # 销毁显示摄像头视频的窗口

操作效果图像:

1.2.2 将摄像头视频由彩色转化为灰度视频

操作代码示例:

import cv2

capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本内置摄像头
while (capture.isOpened()): # 笔记本内置摄像头被打开后
    retval, image = capture.read() # 从摄像头中实时读取视频
    # 把彩色视频转换为灰度视频
    image_Gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    if retval == True: # 读取到摄像头视频后
        cv2.imshow("Video", image) # 在窗口中显示彩色视频
        cv2.imshow("Video_Gray", image_Gray) # 在窗口中显示灰度视频
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 32: # 如果按下空格键
        break
capture.release() # 关闭笔记本内置摄像头
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

操作效果图像:

1.2.3 显示并保存摄像头视频某一时刻图像

操作代码示例:

import cv2

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本内置摄像头
while (cap.isOpened()): # 笔记本内置摄像头被打开后
    ret, frame = cap.read() # 从摄像头中实时读取视频
    cv2.imshow("Video", frame) # 在窗口中显示视频
    k = cv2.waitKey(1) # 图像的刷新时间为1毫秒
    if k == 32: # 按下空格键
        cap.release() # 关闭笔记本内置摄像头
        cv2.destroyWindow("Video") # 销毁名为Video的窗口
        cv2.imwrite("A:/copy.png", frame) # 保存按下空格键时摄像头视频中的图像
        cv2.imshow('img', frame) # 显示按下空格键时摄像头视频中的图像
        cv2.waitKey() # 刷新图像
        break
cv2.destroyAllWindows() # 销毁显示图像的窗口

保存的图像:

1.2.4 读取并显示两个摄像头视频

操作示例代码:

import cv2

cap_Inner = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本内置摄像头
cap_Outer = cv2.VideoCapture(1, cv2.CAP_DSHOW) # 打开一个连接笔记本的外置摄像头
while (cap_Inner.isOpened() & cap_Outer.isOpened()): # 两个摄像头都被打开后
    retval, img_Inner = cap_Inner.read() # 从笔记本内置摄像头中实时读取视频
    ret, img_Outer = cap_Outer.read() # 从连接笔记本的外置摄像头中实时读取视频
    # 在窗口中显示笔记本内置摄像头读取到的视频
    cv2.imshow("Video_Inner", img_Inner)
    # 在窗口中显示连接笔记本的外置摄像头读取到的视频
    cv2.imshow("Video_Outer", img_Outer)
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 32: # 如果按下空格键
        break
cap_Inner.release() # 关闭笔记本内置摄像头
cap_Outer.release() # 关闭连接笔记本的外置摄像头
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

操作效果图像:

2. 播放视频文件

2.1 读取并显示视频文件

VideoCapture类的构造方法VideoCapture()不仅能够用于完成摄像头的初始化工作,还能够用于完成视频文件的初始化工作,此时,其语法格式如下:

video = cv2.VideoCapture(filename)

参数说明:

video:要打开的视频

filename:打开的视频文件名

2.1.1 读取并显示视频文件

操作示例代码:

import cv2

video = cv2.VideoCapture(r"C:\Users\cgs\Desktop\pictures\csdn1.mp4") # 打开视频文件
while (video.isOpened()): # 视频文件被打开后
    retval, image = video.read() # 读取视频文件
    # 设置“Video”窗口的宽为420,高为700
    cv2.namedWindow("Video", 0)
    cv2.resizeWindow("Video", 420, 700)
    if retval == True: # 读取到视频文件后
        cv2.imshow("Video", image) # 在窗口中显示读取到的视频文件
    else: # 没有读取到视频文件
        break
    key = cv2.waitKey(10) # 窗口的图像刷新时间为1毫秒
    if key == 27: # 如果按下Esc键
        break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口

操作效果:

2.1.2 将视频文件由彩色视频转换为灰度视频

操作代码示例:

import cv2

video = cv2.VideoCapture(r"C:\Users\cgs\Desktop\pictures\csdn1.mp4") # 打开视频文件
while (video.isOpened()): # 视频文件被打开后
    retval, img_Color = video.read() # 读取视频文件
    # 设置“Video”窗口的宽为420,高为700
    cv2.namedWindow("Gray", 0)
    cv2.resizeWindow("Gray", 420, 700)
    if retval == True: # 读取到视频文件后
        # 由彩色视频转换为灰度视频
        img_Gray = cv2.cvtColor(img_Color, cv2.COLOR_BGR2GRAY)
        cv2.imshow("Gray", img_Gray) # 在窗口中显示读取到的视频文件
    else: # 没有读取到视频文件
        break
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 27: # 如果按下Esc键
        break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口

操作效果:

2.2 视频的暂停播放和继续播放

操作代码示例:空格键实现暂停和继续播放,Esc关闭视频文件。

import cv2

video = cv2.VideoCapture(r"C:\Users\cgs\Desktop\pictures\csdn2.mp4") # 打开视频文件
while (video.isOpened()): # 视频文件被打开后
    retval, image = video.read() # 读取视频文件
    # 设置“Video”窗口的宽为420,高为300
    cv2.namedWindow("Video", 0)
    cv2.resizeWindow("Video", 420, 300)
    if retval == True: # 读取到视频文件后
        cv2.imshow("Video", image) # 在窗口中显示读取到的视频文件
    else: # 没有读取到视频文件
        break
    key = cv2.waitKey(50) # 窗口的图像刷新时间为50毫秒
    if key == 32: # 如果按下空格键
        cv2.waitKey(0) # 不刷新图像,实现暂停效果
        continue # 再按一次空格键,继续播放
    if key == 27: # 如果按下Esc键
        break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口

2.3 获取视频文件的属性

VideoCapture类提供了get()方法来获取视频文件的属性,其语法格式如下:

retval = cv2.VideoCapture.get(propId)

参数说明:

retval:获取到与propId对应的属性值。

propId:视频文件的属性值。

VideoCapture类提供视频文件的属性值及其含义如下表: 

2.3.1 获取并输出视频文件的指定属性值

操作示例代码:

import cv2

video = cv2.VideoCapture(r"C:\Users\cgs\Desktop\pictures\csdn2.mp4") # 打开视频文件
fps = video.get(cv2.CAP_PROP_FPS) # 获取视频文件的帧速率
frame_Count = video.get(cv2.CAP_PROP_FRAME_COUNT) # 获取视频文件的帧数
frame_Width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频文件的帧宽度
frame_Height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频文件的帧高度
# 输出获取到的属性值
print("帧速率:", fps)
print("帧数:", frame_Count)
print("帧宽度:", frame_Width)
print("帧高度:", frame_Height)

操作结果:

找一个视频来试试吧!!!

2.3.2 动态显示视频文件的属性值

操作代码示例:

import cv2

video = cv2.VideoCapture(r"C:\Users\cgs\Desktop\pictures\csdn2.mp4") # 打开视频文件
fps = video.get(cv2.CAP_PROP_FPS) # 获取视频文件的帧速率
frame_Num = 1 # 用于记录第几幅图像(即第几帧),初始值为1(即第1幅图像)
while (video.isOpened()): # 视频文件被打开后
   retval, frame = video.read() # 读取视频文件
   # 设置“Video”窗口的宽为420,高为300
   cv2.namedWindow("Video", 0)
   cv2.resizeWindow("Video", 420, 700)
   if retval == True: # 读取到视频文件后
      # 当前视频播放到第几帧
      cv2.putText(frame, "frame: " + str(frame_Num), (0, 50),
               cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 255), 2)
      # 该帧对应着视频的第几秒
      cv2.putText(frame, "second: " + str(round(frame_Num / fps, 2)) + "s",
               (0, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 255), 2)
      
      cv2.putText(frame, "width: 610", (0, 150),
               cv2.CAP_PROP_FRAME_WIDTH, 2, (255, 255, 0), 2)
      
      cv2.putText(frame, "height: 1030", (0, 200),
               cv2.CAP_PROP_FRAME_HEIGHT, 2, (255, 0, 0), 2)
      
      cv2.imshow("Video", frame) # 在窗口中显示读取到的视频文件
   else: # 没有读取到视频文件
      break
   key = cv2.waitKey(20) # 窗口的图像刷新时间为50毫秒
   frame_Num += 1 #
   if key == 27: # 如果按下Esc键
      break
video.release() # 关闭视频文件
cv2.destroyAllWindows() # 销毁显示视频文件的窗口

操作效果展示:

3. 保存视频文件

3.1 VideoWriter类

VideoWriter类中的常用方法包括VideoWeiter类的构造方法、write()方法()和release()方法。其中,VideoWriter类的构造方法用于创建VideoCapture类对象,其语法格式如下:

<VideoWriter boject> = cv2.VideoWriter(filename,fourcc,fps,framSize)

参数说明:

VideoWriter object:VideoWriter类对象。

filename:保存视频时的路径。

fourcc:用四个字符表示的视频编码格式。

fps:帧速率。

frameSize:每一帧的大小。

                                                   常用的视频编码格式

 下面是Windows操作系统下创建一个VideoWriter类对象的示例

fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') # 确定视频被保存后的编码格式
output = cv2.VideoWriter("output.avi", fourcc, 20, (640, 480)) # 创建VideoWriter类对象

为了保存一段视频,处理需要使用VideoCapture类的构造方法外,还需要使用到VideoCapture类提供的writer()方法。其作用是在创建好的VideoCapture类对象中下入读取到的帧 。语法格式如下:

cv2.VideoWriter.write(frame)

参数说明:

frame:读取到的帧。

当不需要使用VideoWriter类对象时,需要将其释放掉,为此VideoWriter类提供了release()方法,其语法格式如下:

cv2.VideoWriter.release()

3.2 如何使用VideoWriter类

3.2.1 保存一段视像头视频

操作代码示例:

import cv2

capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 打开笔记本内置摄像头
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') # 确定视频被保存后的编码格式
output = cv2.VideoWriter("dmsj.avi", fourcc, 20, (640, 480)) # 创建VideoWriter类对象
while (capture.isOpened()): # 笔记本内置摄像头被打开后
    retval, frame = capture.read() # 从摄像头中实时读取视频
    if retval == True: # 读取到摄像头视频后
        output.write(frame) # 在VideoWriter类对象中写入读取到的帧
        cv2.imshow("frame", frame) # 在窗口中显示摄像头视频
    key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒
    if key == 27: # 如果按下Esc键
        break
capture.release() # 关闭笔记本内置摄像头
output.release() # 释放VideoWriter类对象
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

操作结果显示:

3.2.2 保存一段指定时长的摄像头视频

操作代码示例:

import cv2

capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)  # 打开笔记本内置摄像头
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')  # 确定视频被保存后的编码格式
fps = 20  # 帧速率
# 创建VideoWriter类对象
output = cv2.VideoWriter("dmsj.mp4", fourcc, fps, (640, 480))
frame_Num = 13 * fps  # 时长为13秒的摄像头视频含有的帧数
# 笔记本内置摄像头被打开且时长为13秒的摄像头视频含有的帧数大于0
while capture.isOpened() and frame_Num > 0:
    retval, frame = capture.read()  # 从摄像头中实时读取视频
    if retval == True:  # 读取到摄像头视频后
        output.write(frame)  # 在VideoWriter类对象中写入读取到的帧
        cv2.imshow("frame", frame)  # 在窗口中显示摄像头视频
    key = cv2.waitKey(1)  # 窗口的图像刷新时间为1毫秒
    frame_Num -= 1  # 时长为10秒的摄像头视频含有的帧数减少一帧
capture.release()  # 关闭笔记本内置摄像头
output.release()  # 释放VideoWriter类对象
cv2.destroyAllWindows()  # 销毁显示摄像头视频的窗口

操作效果展示:

3.2.3 保存视频文件

操作代码示例:

import cv2

video = cv2.VideoCapture(r"C:\Users\cgs\Desktop\pictures\csdn2.mp4") # 打开视频文件
fps = video.get(cv2.CAP_PROP_FPS) # 获取视频文件的帧速率
# 获取视频文件的帧大小
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V') # 确定视频被保存后的编码格式
output = cv2.VideoWriter("cgs.mp4", fourcc, fps, size) # 创建VideoWriter类对象
while (video.isOpened()): # 视频文件被打开后
    retval, frame = video.read() # 读取视频文件
    if retval == True: # 读取到视频文件后
        output.write(frame) # 在VideoWriter类对象中写入读取到的帧
    else:
        break
print("视频已保存") # 控制台输出提示信息
video.release() # 关闭视频文件
output.release() # 释放VideoWriter类对象

3.2.4 保存视频文件中的前10秒视频

操作代码示例:

import cv2

video = cv2.VideoCapture(r"C:\Users\cgs\Desktop\pictures\csdn2.mp4") # 打开视频文件
fps = video.get(cv2.CAP_PROP_FPS) # 获取视频文件的帧速率
# 获取视频文件的帧大小
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') # 确定视频被保存后的编码格式
output = cv2.VideoWriter("ten_Seconds.avi", fourcc, fps, size) # 创建VideoWriter类对象
frame_Num = 10 * fps # 视频文件的前10秒视频含有的帧数
# 视频文件被打开后且视频文件的前10秒视频含有的帧数大于0
while (video.isOpened() and frame_Num > 0):
    retval, frame = video.read() # 读取视频文件
    if retval == True: # 读取到视频文件后
        output.write(frame) # 在VideoWriter类对象中写入读取到的帧
    frame_Num -= 1 # 视频文件的前10秒视频含有的帧数减少一帧
# 控制台输出提示信息
print("已保存10秒视频!")
video.release() # 关闭视频文件
output.release() # 释放VideoWriter类对象

操作效果展示:

本章节的内容就到这里了,欢迎大家继续关注!!!

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

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

相关文章

【区间dp】AT_dp_l 题解

题意 给一个双端队列&#xff0c;双方轮流取数&#xff0c;每一次能且只能从队头或队尾取数&#xff0c;取完数后将这个数从队列中弹出。双方都希望自己取的所有数之和尽量大&#xff0c;且双方都以最优策略行动&#xff0c;假设先手取的所有数之和为 X X X&#xff0c;后手取…

【Git】一文看懂Git

Git 一、简介1. Git 与 SVN 区别1.1 Git 是分布式的&#xff0c;SVN 不是1.1.1 分布式版本控制系统Git1.1.2 集中式版本控制系统SVN 1.2 Git 把内容按元数据方式存储&#xff0c;而 SVN 是按文件1.3 Git 分支和 SVN 的分支不同1.4 Git 没有一个全局的版本号&#xff0c;而 SVN …

五.运输层

目录 5.1概述 5.2传输层的寻址与端口 熟知端口号 套接字(Socket) 5.3 UDP 特点 UDP报文格式 UDP校验 二进制反码求和 5.4 TCP 特点 可靠传输 停止等待协议 流水线方式 累计应答 流量控制 滑动窗口 拥塞控制 三次握手&#xff0c;四次握手 5.1概述 只有主机…

Pikachu-Cross-Site Scripting-反射型xss(get)

存储型XSS 存储型XSS是指恶意脚本被存储在目标服务器上&#xff0c;当用户访问包含该脚本的页面时&#xff0c;脚本会被执行。攻击者通常通过输入框、留言板等用户可输入的地方进行注入。例如&#xff0c;攻击者可以在留言板中输入恶意脚本&#xff0c;当其他用户查看留言时&a…

3.基于分数的生成模型

1.简介 基于分数的生成模型(SGM)的核心是Stein分数(或分数函数)。给定一个概率密度函数p(x)&#xff0c;其分数函数定义为对数概率密度的梯度Vxlogp(x)。生成模型通过学习并建模输入数据的分布&#xff0c;从而采集生成新的样木&#xff0c;该模型广泛运用于图片视频生成、文本…

假期惊喜,收到公司款项86167.14元

假期惊喜 近日&#xff0c;有网友爆料称&#xff0c;比亚迪在未提前通知员工的情况下&#xff0c;突然发放了利润奖金。 有人获得了七八万元&#xff0c;也有人拿到了十多万元。 一位比亚迪员工的帖子显示&#xff0c;在9月26日下午&#xff0c;他的银行卡突然收到一笔 86167.1…

数字化那点事:一文读懂数字孪生

一、数字孪生的定义 数字孪生&#xff08;Digital Twin&#xff09;是指通过数字技术构建的物理实体的虚拟模型&#xff0c;能够对该实体进行全方位、动态跟踪和仿真预测。简单来说&#xff0c;数字孪生就是在一个设备或系统的基础上创造一个数字版的“克隆体”&#xff0c;这…

Redis --- 第二讲 --- 特性和安装

一、背景知识 Redis特性&#xff1a; Redis是一个在内存中存储数据的中间件&#xff0c;用于作为数据库&#xff0c;作为缓存&#xff0c;在分布式系统中能够大展拳脚。Redis的一些特性造就了现在的Redis。 在内存中存储数据&#xff0c;通过一系列的数据结构。MySQL主要是通…

Ollama安装部署CodeGeeX4 - ALL - 9B

一、模型本地部署准备 1、 conda create -n ollama python3.82、 curl -fsSL https://ollama.com/install.sh | sh3、验证安装 安装完成后&#xff0c;通过运行以下命令来验证Ollama是否正确安装&#xff1a; ollama --version4、启动ollama ollama serve模型地址&#xff…

【重学 MySQL】四十八、DCL 中的 commit 和 rollback

【重学 MySQL】四十八、DCL 中的 commit 和 rollback commit的定义与作用rollback的定义与作用使用场景相关示例注意事项DDL 和 DML 的说明 在MySQL中&#xff0c;DCL&#xff08;Data Control Language&#xff0c;数据控制语言&#xff09;用于管理数据库用户和控制数据的访问…

Ubuntu 安装RUST

官方给的是这样如下脚本 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh 太慢了 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh -x 执行这个脚本后会给出对应的下载链接 如下图 我直接给出来 大多数应该都是这个 https://static.rust-…

初识算法 · 双指针(1)

目录 前言&#xff1a; 双指针算法 题目一&#xff1a; ​编辑 题目二: 前言&#xff1a; 本文作为算法部分的第一篇文章&#xff0c;自然是少不了简单叭叭两句&#xff0c;对于算法部分&#xff0c;多刷是少不了&#xff0c;我们刷题从暴力过度到算法解法&#xff0c;自…

csp-j模拟二补题报告

目录传送门 前言第一题下棋&#xff08;chess&#xff09;我的代码&#xff08;AC了&#xff09;AC代码 第二题汪洋&#xff08;BigWater&#xff09;我的代码&#xff08;0&#xff09;AC代码 第三题删数&#xff08;delnum&#xff09;我的代码&#xff08;0&#xff09;AC代…

秋招突击——9/13——携程提前准备和实际面经——专程飞过去线下,结果一面挂(难受)

文章目录 引言面经收集面经整理一1. ArrayList和LinkedList2. 线程安全的列表和链表有么&#xff1f;如果没有怎么实现&#xff1f;3. threadlocal4. synchronized锁升级过程及原理5. ReentrantLock原理&#xff0c;以及和synchronized的对比6. 线程池工作原理7. redis常用数据…

数据流和数据流处理技术

一数据流 首先明确数据流概念&#xff1a;数据流是连续不断生成的、快速变化的无界数据序列 数据流类型&#xff1a; 数据流大致可以分为四种类型 1.连续型数据流&#xff1a;不断地产生数据&#xff0c;数据稳定速度输入系统。 2.突发型数据流&#xff1a;在某特定时间或…

【吊打面试官系列-MySQL面试题】Mysql如何存储日期?

大家好&#xff0c;我是锋哥。今天分享关于【Mysql如何存储日期&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Mysql如何存储日期&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Datatime:以 YYYY-MM-DD HH:MM:SS 格式存储时期时间&a…

基于Spring Boot+Unipp的中考体测训练小程序(协同过滤算法、图形化分析)【原创】

&#x1f388;系统亮点&#xff1a;协同过滤算法、图形化分析&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框…

C++中stack和queue的模拟实现

目录 1.容器适配器 1.1什么是适配器 1.2STL标准库中stack和queue的底层结构 1.3deque的简单介绍 1.3.1deque的原理介绍 1.3.2deque的优点和缺陷 1.3.3deque和vector进行排序的性能对比 1.4为什么选择deque作为stack和queue的底层默认容器 2.stack的介绍和模拟…

c++-类和对象-点和圆关系

注意&#xff1a; 1.在一个类中可以让另一个类作为成员 2.可以把一个类拆成过个头文件&#xff0c;在.cpp中写成员函数实现&#xff0c;在头文件中留下类的声明和属性 实践 结果

我谈陷波滤波器

《数字图像处理&#xff08;电子信息前沿技术丛书&#xff09;》PP180~182勘误。 陷波滤波器在信号处理中就是带阻滤波器&#xff0c;信号处理中陷波滤波器不是这样定义的&#xff0c;二维比一维有这样的特殊性&#xff0c;我想这是Gonzalez创造的概念&#xff0c;在学术中借用…