您的当前位置:首页正文

【opencv-Python学习笔记:视频处理】

来源:华佗健康网
综合应用1

## 读取播放视频

import cv2

# 读取视频,并展示
cap=cv2.VideoCapture("./video/1.mp4")

if cap.isOpened():

    print("视频打开成功")
    while True:
        ret,frame=cap.read()
        if not ret:
            break
        cv2.imshow("窗口", frame)
        cv2.waitKey(1)
# 释放窗口
    cap.release()
    cv2.destroyAllWindows()
else:
    print("请重新打开视频")

注意:cv2.WaitKey()函数

  • 如果参数delay为0,那么程序会一直等待,直到有按下按键的事件发生,才会执行后续的程序,因为读取的是视频帧,所以为0的情况,会一直读取一张照片,直到用户按下按键
  • 若delay为一个正数,在这个时间内,用户按下键,就会执行后续程序,若超过时间,则继续执行后续的程序
  if cv2.waitKey(1) & 0xFF == ord('q'):
            break

解释:按下q键程序结束

 综合应用2

## 在一个文件夹中有很多视频,将视频进行处理,每30帧保存一张,并存储到一个文件夹,并编号

import cv2
import os

def process_video(video_path, output_folder, save_step, start_num):
    video = cv2.VideoCapture(video_path)
    frame_count = 0  # 当前帧数
    image_count = start_num  # 从 start_num 开始编号图片

    while True:
        ret, frame = video.read()
        if not ret:
            break  # 视频结束,退出循环
        frame_count += 1
        if frame_count % save_step == 0:  # 每隔 save_step 帧保存一次
            img_name = os.path.join(output_folder, f"{image_count}.jpg")
            cv2.imwrite(img_name, frame)
            print(f"Saved {img_name}")
            image_count += 1

    video.release()
    print(f"视频 {video_path} 处理完成!")

    return image_count  # 返回下一个图片编号的起始值


def process_videos_in_folder(input_folder, output_folder, save_step=30):
    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    image_count = 2320  # 图片编号从0开始

    # 遍历文件夹中的所有视频文件
    for filename in os.listdir(input_folder):
        if filename.endswith(".mp4") or filename.endswith(".avi") or filename.endswith(".mov"):  # 支持多种视频格式
            video_path = os.path.join(input_folder, filename)

            print(f"开始处理视频: {filename}")
            # 处理视频并更新下一个文件的起始编号
            image_count = process_video(video_path, output_folder, save_step, image_count)

# 使用示例
input_folder = './data2/'  # 包含视频文件的文件夹路径
output_folder = './data3/'  # 存放输出图片的文件夹路径(所有图片放在一个文件夹)
save_step = 30  # 每30帧保存一张图片

process_videos_in_folder(input_folder, output_folder, save_step)

1. cv2.VideoCapture()

说明:cv2.VideoCapture 是 OpenCV 库中用于处理视频文件或视频流的类。它可以从文件、摄像头或视频流中捕获帧,提供各种方法来控制和获取视频属性,是视频处理和计算机视觉应用中常用的工具。

1.1 创建 cv2.VideoCapture 对象
import cv2

# 通过视频文件创建 VideoCapture 对象
cap = cv2.VideoCapture('video.mp4')

# 或者通过摄像头创建 VideoCapture 对象,通常 0 表示第一个摄像头
cap = cv2.VideoCapture(0)

解释:

  • 里面可以直接填写视频路径,
  • 也可以打开摄像头,默认值为-1表示随机摄像头、0表示第一个摄像头、1表示第二个摄像头,以此类推
1.2 open()、isOpened()函数

说明:防止打开摄像头、视频出现错误,用来检测初始化是否成功

语法:ret=cv2.VideoCapture().isOpened()

  • 若成功,返回值ret为TRUE
  • 若不成功,返回值ret为False
if cap.isOpened():
    print("视频文件成功打开")
else:
    print("无法打开视频文件或摄像头")

注意:经常搭配循环来使用

1.3 捕获帧

说明:视频或摄像头经过初始化之后,可以捕获帧了

语法:cap=cv2.VideoCapture().read()

  • ret为bool值,表示是否读取成功
  • 读取的帧(图像)数据。失败时返回 None
ret, frame = cap.read()
if ret:
    cv2.imshow("Frame", frame)

1.4 释放

说明:视频处理完之后,需要进行释放,来释放内存

语法:cap=cv2.VideoCapture().release()

1.5 获取、设置视频属性

语法:ret.get()         # 获取视频对象属性

语法:ret.set()         # 设置视频对象属性

fps = cap.get(cv2.CAP_PROP_FPS)  # 获取帧率
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 获取视频宽度
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 获取视频高度
cap.set(cv2.CAP_PROP_POS_FRAMES, 10)  # 设置视频位置到第 10 帧
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)  # 设置帧宽度为 640
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)  # 设置帧高度为 480

注意:属性可通过propId来表示

2 . cv2.VideoWriter()

说明:cv2.VideoWriter() 是 OpenCV 提供的一个类,用于将图像帧保存为视频文件。它允许设置视频编码格式、帧率、分辨率等参数,非常适合在视频处理任务中生成输出视频文件

2.1 创建 cv2.VideoWriter 对象

语法:ret=cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=True)

解释:

  • filename指定输出视频文件的文件名(包括文件路径和扩展名)。例如 'output.avi''output.mp4'
  • fourcc:表示视频的编码格式(FourCC 编码)。FourCC 是一个四字符编码,用于指定视频编码格式
cv2.VideoWriter_fourcc(*'XVID')生成 .avi 格式的视频文件
cv2.VideoWriter_fourcc(*'MP4V')生成 .mp4 格式的视频文件
cv2.VideoWriter_fourcc(*'MJPG')生成 .avi 格式的文件,支持 JPEG 编码
  • fps:视频的帧率(frames per second),即每秒播放的帧数。较高的帧率可以生成更流畅的视频,但会增加文件大小
  • frameSize:视频帧的大小(宽度,高度),以像素为单位,通常为图像帧的分辨率。
  • isColor:指定是否为彩色视频。默认为 True 表示彩色视频,False 表示灰度视频。
import cv2

# 定义输出文件的名称
filename = 'output.avi'

# 指定编码格式
fourcc = cv2.VideoWriter.fourcc(*'XVID')

# 设置帧率和帧大小
fps = 20.0
frameSize = (640, 480)

# 创建 VideoWriter 对象
out = cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=True)

2.2  write(frame):写入帧

说明:write() 方法用于将图像帧写入视频文件。帧的分辨率(宽度和高度)必须与 frameSize 参数一致。

import cv2

# 打开视频文件
cap = cv2.VideoCapture('./video/1.mp4')

# 获取视频的宽度、高度和帧率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)

# 创建 VideoWriter 对象
fourcc = cv2.VideoWriter.fourcc(*'MP4V')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height))

if cap.isOpened():
    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 将当前帧写入输出视频
        out.write(frame)

        # 显示当前帧(可选)
        cv2.imshow('Frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 释放 VideoCapture 和 VideoWriter 资源
    cap.release()
    out.release()
    cv2.destroyAllWindows()
else:
    print("无法打开视频文件")


 

因篇幅问题不能全部显示,请点此查看更多更全内容