2024-12-04OpenCV视频处理基础

OpenCV代码示例


1-OpenCV视频捕获


在 OpenCV 中,cv2.VideoCapture() 是一个用于捕获视频流的类。它可以用来从摄像头捕获实时视频,或者从视频文件中读取帧。以下是如何使用 cv2.VideoCapture() 实现视频捕获、设置捕获属性以及释放捕获对象的详细步骤。

1. 使用 cv2.VideoCapture() 捕获摄像头

import cv2

# 打开默认摄像头(通常是0)
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
    exit()

while True:
    # 读取一帧
    ret, frame = cap.read()
    
    # 检查是否成功读取帧
    if not ret:
        print("无法获取帧")
        break
    
    # 显示帧
    cv2.imshow('Camera Feed', frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

2. 使用 cv2.VideoCapture() 捕获视频文件

import cv2

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

if not cap.isOpened():
    print("无法打开视频文件")
    exit()

while True:
    # 读取一帧
    ret, frame = cap.read()
    
    # 检查是否成功读取帧
    if not ret:
        print("视频结束或无法读取帧")
        break
    
    # 显示帧
    cv2.imshow('Video Playback', frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

3. 设置视频捕获属性

OpenCV 允许你通过 cap.set() 方法来设置视频捕获的属性。常见的属性包括帧宽、帧高、帧率等。

import cv2

# 打开默认摄像头
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 设置帧宽和帧高
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

# 设置帧率(每秒帧数)
cap.set(cv2.CAP_PROP_FPS, 30)

while True:
    # 读取一帧
    ret, frame = cap.read()
    
    # 检查是否成功读取帧
    if not ret:
        print("无法获取帧")
        break
    
    # 显示帧
    cv2.imshow('Camera Feed', frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

4. 释放视频捕获对象

无论你是从摄像头还是视频文件捕获视频,在完成视频处理后,都应该释放 cv2.VideoCapture() 对象,并关闭所有打开的窗口。

cap.release()
cv2.destroyAllWindows()

总结

  • cv2.VideoCapture(0) 用于捕获摄像头视频。
  • cv2.VideoCapture('file.mp4') 用于捕获视频文件。
  • cap.set(propId, value) 用于设置视频捕获属性。
  • cap.release() 用于释放视频捕获对象。
  • cv2.destroyAllWindows() 用于关闭所有 OpenCV 窗口。

通过这些步骤,你可以在 OpenCV 中实现视频捕获、设置属性以及释放资源。


OpenCV视频写入


在 OpenCV 中,cv2.VideoWriter() 是一个用于将视频帧写入视频文件的类。你可以使用 cv2.VideoWriter() 将捕获到的帧写入到视频文件中。以下是如何使用 cv2.VideoWriter() 实现视频写入、设置写入参数、逐帧写入以及释放写入对象的详细步骤。

1. 使用 cv2.VideoWriter() 写入视频

首先,你需要创建一个 cv2.VideoWriter() 对象,并指定视频文件的输出路径、编解码器、帧率和帧大小。

import cv2

# 打开默认摄像头
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 获取帧的宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 定义输出视频文件的参数
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height))

while True:
    # 读取一帧
    ret, frame = cap.read()
    
    # 检查是否成功读取帧
    if not ret:
        print("无法获取帧")
        break
    
    # 写入帧到视频文件
    out.write(frame)
    
    # 显示帧
    cv2.imshow('Camera Feed', frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放捕获对象和写入对象,并关闭所有窗口
cap.release()
out.release()
cv2.destroyAllWindows()

2. 设置视频写入参数

在创建 cv2.VideoWriter() 对象时,你需要设置以下参数:

  • 文件名:输出视频文件的路径。
  • FourCC:编解码器,这是一个 4 字节的代码,表示视频编解码器。常用的编解码器包括:
    • cv2.VideoWriter_fourcc('M','J','P','G')cv2.VideoWriter_fourcc(*'MJPG') 表示 Motion JPEG。
    • cv2.VideoWriter_fourcc('X','V','I','D')cv2.VideoWriter_fourcc(*'XVID') 表示 XVID。
  • 帧率:每秒帧数(FPS),通常设置为 30 或 25。
  • 帧大小:视频的宽度和高度。
# 定义输出视频文件的参数
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height))

3. 逐帧写入视频

在读取每一帧后,你可以使用 out.write(frame) 将帧写入视频文件。

while True:
    # 读取一帧
    ret, frame = cap.read()
    
    # 检查是否成功读取帧
    if not ret:
        print("无法获取帧")
        break
    
    # 写入帧到视频文件
    out.write(frame)
    
    # 显示帧
    cv2.imshow('Camera Feed', frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

4. 释放视频写入对象

在完成视频写入后,你应该释放 cv2.VideoCapture()cv2.VideoWriter() 对象,并关闭所有打开的窗口。

# 释放捕获对象和写入对象,并关闭所有窗口
cap.release()
out.release()
cv2.destroyAllWindows()

总结

  • cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height)) 用于创建视频写入对象。
  • out.write(frame) 用于逐帧写入视频。
  • out.release() 用于释放视频写入对象。
  • cap.release() 用于释放视频捕获对象。
  • cv2.destroyAllWindows() 用于关闭所有 OpenCV 窗口。

通过这些步骤,你可以在 OpenCV 中实现视频写入、设置参数、逐帧写入以及释放资源。


OpenCV视频帧处理


在 OpenCV 中,你可以逐帧读取视频帧,对这些帧进行处理,显示处理后的帧,并将处理后的帧保存到视频文件中。以下是如何实现这些功能的详细步骤。

1. 逐帧读取视频帧

使用 cv2.VideoCapture() 对象的 read() 方法逐帧读取视频帧。

import cv2

# 打开视频文件或摄像头
cap = cv2.VideoCapture('video.mp4')  # 或者 cap = cv2.VideoCapture(0) 为摄像头

if not cap.isOpened():
    print("无法打开视频文件或摄像头")
    exit()

while True:
    # 读取一帧
    ret, frame = cap.read()
    
    # 检查是否成功读取帧
    if not ret:
        print("无法获取帧或视频结束")
        break
    
    # 对帧进行处理
    processed_frame = process_frame(frame)
    
    # 显示处理后的帧
    cv2.imshow('Processed Frame', processed_frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

2. 处理视频帧

你可以对视频帧进行各种处理,例如滤波、增强、特征提取等。以下是一个简单的例子,对帧进行灰度处理。

def process_frame(frame):
    # 将帧转换为灰度
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    return gray_frame

3. 显示视频帧

使用 cv2.imshow() 函数显示处理后的帧。

cv2.imshow('Processed Frame', processed_frame)

4. 保存处理后的视频帧

将处理后的帧写入一个新的视频文件。你需要创建一个 cv2.VideoWriter() 对象来实现这一点。

import cv2

# 打开视频文件或摄像头
cap = cv2.VideoCapture('video.mp4')  # 或者 cap = cv2.VideoCapture(0) 为摄像头

if not cap.isOpened():
    print("无法打开视频文件或摄像头")
    exit()

# 获取原始帧的宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 创建 VideoWriter 对象
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, (frame_width, frame_height))

while True:
    # 读取一帧
    ret, frame = cap.read()
    
    # 检查是否成功读取帧
    if not ret:
        print("无法获取帧或视频结束")
        break
    
    # 对帧进行处理
    processed_frame = process_frame(frame)
    
    # 显示处理后的帧
    cv2.imshow('Processed Frame', processed_frame)
    
    # 将处理后的帧写入视频文件
    out.write(processed_frame)
    
    # 按下 'q' 键退出循环
    if cv2.waitKey(30) & 0xFF == ord('q'):
        break

# 释放捕获对象和写入对象,并关闭所有窗口
cap.release()
out.release()
cv2.destroyAllWindows()

总结

  • 使用 cv2.VideoCapture() 逐帧读取视频帧。
  • 对每一帧进行处理,例如转换为灰度、应用滤波器等。
  • 使用 cv2.imshow() 显示处理后的帧。
  • 使用 cv2.VideoWriter() 将处理后的帧写入新的视频文件。

通过这些步骤,你可以在 OpenCV 中实现视频帧的逐帧读取、处理、显示和保存。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容