计算机视觉cv2入门之视频处理

在我们进行计算机视觉任务时,经常会对视频中的图像进行操作,这里我来给大家分享一下,cv2对视频文件的操作方法。这里我们主要介绍cv2.VideoCapture函数的基本使用方法。

cv2.VideoCapture函数

当我们在使用cv2.VideoCapture函数时,我们通常使用轮询的方式,即:

python 复制代码
while True:
    if condition1:
        do something
    if condition2:
        break
    ...

更一般化的是

python 复制代码
import cv2
#这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename='')
cap=cv2.VideoCapture(index=0)
if cap.isOpened():
    while True:
        ret,frame=cap.read()
        #...
        #... 针对视频中的每一帧图像的其他操作
        #....
        if not ret:
            break
        cv2.imshow('test',frame)
        key=cv2.waitKey(1)
        if key==27:#置顶一个按键来结束循环,这里使用esc健的ASCII码
            break
    cap.release()
    cv2.destroyAllWindows()
else:
    print('摄像头未打开')

初始化

视频文件

如果你需要处理的是已有的视频文件,而不是打开摄像头捕获的实时视频流,那么只需要传入filename即可。apiPerference是可选参数主要用来指定视频捕获的后端,即使用哪种顶层API来读取视频流或摄像头,默认值是cv2.CAP_ANY由opencv自动选择

python 复制代码
import cv2
'''
filename:视频文件路径 .mp4
apiPerference:指定视频捕获的后端(即使用哪种底层API来读取视频流或摄像头)

apiPerference参数常用flag:
cv2.CAP_ANY:	自动选择默认后端(OpenCV自行决定)跨平台
cv2.CAP_ANDROID:  使用Android的Camera2 API
cv2.CAP_DSHOW:	使用DirectShow(Windows专用)
cv2.CAP_MSMF:    使用Microsoft Media Foundation(Windows 10+)
cv2.CAP_V4L2:    使用Video4Linux2(Linux专用)Linux
cv2.CAP_FFMPEG:	 使用FFmpeg解码视频文件跨平台(需安装 FFmpeg)
cv2.CAP_GSTREAMER:	使用 GStreamer(Linux常用)
cv2.CAP_OPENNI:	用于深度摄像头(如Kinect)特定设备
'''
cap=cv2.VideoCapture(r'test.mp4')

实时视频流

如果你处理的是实时视频流,那么需要设置index参数,不使用外接设备时index一般都设置为apiPerference是可选参数主要用来指定视频捕获的后端,即使用哪种顶层API来读取视频流或摄像头,默认值是cv2.CAP_ANY由opencv自动选择

python 复制代码
import cv2
'''
index:0或1,0是电脑内置摄像头,1是外接摄像头,没有外接摄像头仍然设置Index=1的话不会报错,只是代码不运行
apiPerference:指定视频捕获的后端(即使用哪种底层API来读取视频流或摄像头)

apiPerference参数常用flag:
cv2.CAP_ANY:	自动选择默认后端(OpenCV自行决定)跨平台
cv2.CAP_ANDROID:  使用Android的Camera2 API
cv2.CAP_DSHOW:	使用DirectShow(Windows专用)
cv2.CAP_MSMF:    使用Microsoft Media Foundation(Windows 10+)
cv2.CAP_V4L2:    使用Video4Linux2(Linux专用)Linux
cv2.CAP_FFMPEG:	 使用FFmpeg解码视频文件跨平台(需安装 FFmpeg)
cv2.CAP_GSTREAMER:	使用 GStreamer(Linux常用)
cv2.CAP_OPENNI:	用于深度摄像头(如Kinect)特定设备
'''
cap=cv2.VideoCapture(index=1,apiPreference=cv2.CAP_ANY)

常用属性

cap.isOpened()

检查视频源是否打开,返回值为True 或False

python 复制代码
import cv2
cap=cv2.VideoCapture(index=0,apiPreference=cv2.CAP_MSMF)
if cap.isOpened():
    print('摄像头已打开')
    while True:
        ret,frame=cap.read()
        cv2.imshow('test',frame)
        key=cv2.waitKey(1)
        if key==27:#按下esc健退出
            break
    cap.release()
    cv2.destroyAllWindows()
else:
    print('摄像头未打开')

cap.read()

用来读取视频中的下一帧,返回值为(ret,frame) ret为是否成功,frame为图像数据

cap.read()是我们处理视频文件中最关键的函数,如果没有这一步,那么根本无法处理视频文件中的图像。

python 复制代码
import cv2
cap=cv2.VideoCapture(index=0,apiPreference=cv2.CAP_MSMF)
if cap.isOpened():
    print('摄像头已打开')
    while True:
        ret,frame=cap.read()
        if not ret:
            break
        cv2.imshow('test',frame)
        key=cv2.waitKey(1)
        if key==27:#按下esc健退出
            break
    cap.release()
    cv2.destroyAllWindows()
else:
    print('摄像头未打开')

cap.release()

用来释放视频源,出现在cv2.destroyAllWindows()前。

python 复制代码
import cv2
#这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename='')
cap=cv2.VideoCapture(index=0)
if cap.isOpened():
    while True:
        ret,frame=cap.read()
        #...
        #...
        #....
        cv2.imshow('test',frame)
        key=cv2.waitKey(1)
        if key==27:#设定一个按键来结束循环,这里使用esc健的ASCII码
            break
    cap.release()
    cv2.destroyAllWindows()
else:
    print('摄像头未打开')

视频属性控制

cap.get(propId)

用来获取当前视频的属性值,比如帧宽,高,FPS等。

这里我们以获取当前帧率并标记在窗口内为例:

python 复制代码
fps=cv2.get(cv2.CAP_PROP_FPS)

fps的类型为Float

python 复制代码
import cv2
#这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename='')
cap=cv2.VideoCapture(index=0)
if cap.isOpened():
    while True:
        ret,frame=cap.read()
        fps=cap.get(cv2.CAP_PROP_FPS)
        #...
        #...
        #....
        cv2.putText(img=frame,text=f'fps:{fps}',org=(50,50),fontFace=1,fontScale=3,color=(255,0,0))
        cv2.imshow('test',frame)
        key=cv2.waitKey(1)
        if key==27:#设定一个按键来结束循环关闭摄像头,这里使用esc健的ASCII码
            break
    cap.release()
    cv2.destroyAllWindows()
else:
    print('摄像头未打开')

最后,我将所有的本文所有的要点都总结在了下方这个表格里。

参数/方法​ ​说明​
​初始化​
cap=cv2.VideoCapture() 创建视频捕获对象,参数可以是设备索引(摄像头)或视频文件路径。
​常用属性​
cap.isOpened() 检查视频源是否成功打开,返回 True/False
cap.read() 读取下一帧,返回 (ret, frame)ret 为是否成功,frame 为图像数据。
cap.release() 释放视频源。
​视频属性控制​
cap.get(propId) 获取视频属性值(如帧宽、高、FPS 等),propId 为属性标识。
cap.set(propId, value) 设置视频属性值(部分属性可修改)。
​常用属性标识(propId)​
cv2.CAP_PROP_FRAME_WIDTH 帧的宽度(像素)。
cv2.CAP_PROP_FRAME_HEIGHT 帧的高度(像素)。
cv2.CAP_PROP_FPS 视频的帧率(Frames Per Second)。
cv2.CAP_PROP_FRAME_COUNT 视频的总帧数(仅对文件有效)。
cv2.CAP_PROP_POS_MSEC 当前帧的时间戳(毫秒,仅对文件有效)。
cv2.CAP_PROP_POS_FRAMES 当前帧的索引(从 0 开始)。
​其他方法​
cap.grab() 快速抓取下一帧(不解码),通常与 cap.retrieve() 配合使用。
cap.retrieve() 解码并返回由 grab() 抓取的帧。
cap.getBackendName() 返回当前使用的后端名称(如 FFMPEGDSHOW)
相关推荐
TM1Club6 分钟前
AI驱动的预测:新的竞争优势
大数据·人工智能·经验分享·金融·数据分析·自动化
陈天伟教授9 分钟前
人工智能应用-机器听觉:15. 声纹识别的应用
人工智能·神经网络·机器学习·语音识别
zhang133830890759 分钟前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
板面华仔32 分钟前
机器学习入门(三)——决策树(Decision Tree)
人工智能·决策树·机器学习
GAOJ_K1 小时前
滚珠花键的无预压、间隙调整与过盈配合“场景适配型”
人工智能·科技·机器人·自动化·制造
ai_xiaogui1 小时前
【开源探索】Panelai:重新定义AI服务器管理面板,助力团队私有化算力部署与模型运维
人工智能·开源·私有化部署·docker容器化·panelai·ai服务器管理面板·comfyui集群管理
源于花海1 小时前
迁移学习的前沿知识(AI与人类经验结合、传递式、终身、在线、强化、可解释性等)
人工智能·机器学习·迁移学习·迁移学习前沿
king of code porter1 小时前
百宝箱企业版搭建智能体应用-平台概述
人工智能·大模型·智能体
愚公搬代码1 小时前
【愚公系列】《AI短视频创作一本通》004-AI短视频的准备工作(创作AI短视频的基本流程)
人工智能·音视频
物联网软硬件开发-轨物科技1 小时前
【轨物洞见】告别“被动维修”!预测性运维如何重塑老旧电站的资产价值?
运维·人工智能