目录

标签: Python

OpenCV-Python 保存视频帧

本文代码实现目的:通过当前电脑摄像头,录制一段视频并进行垂直翻转处理后,保存为处理后的视频文件。

实现

所以我们捕获一个当前计算机的摄像头视频流并逐帧处理它,我们想要保存该视频。对于图像,它非常简单:只需使用cv.imwrite(). 在这里,需要做更多的工作。

这次我们创建了一个VideoWriter对象。我们应该指定输出文件名(例如:output.avi)。然后我们应该指定FourCC代码。然后应传递每秒帧数 (fps) 和帧大小。最后一个是isColor标志。如果是True,编码器期望彩色帧,否则它适用于灰度帧。

FourCC是一个 4 字节的代码,用于指定视频编解码器。可用代码列表可在fourcc.org中找到。它依赖于平台。以下编解码器对我来说很好用。

执行效果(最终会输出一个 output.avi 视频文件,也就是当前代码运行结果所录制并处理过的的视频):

main.py 代码:

import numpy as np
import cv2 as cv

# 从当前电脑中的摄像头读取视频流
cap = cv.VideoCapture(0)

width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))

# 定义编解码器并创建 VideoWriter 对象
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (width,  height))

# 处理视频
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print('无法收到视频帧数据(该视频流是否已结束?),程序正在退出')
        break

    # 将每一帧视频进行翻转处理,并写入
    frame = cv.flip(frame, 0)
    out.write(frame)

    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break

# 程序结束时,释放资源
cap.release()
out.release()
cv.destroyAllWindows()

本示例直接运行以上代码即可(以上即完整代码)

示例参考原文:https://docs.opencv.org/4.5.5/dd/d43/tutorial_py_video_display.html

OpenCV-Python 读取视频文件并播放

从文件播放视频与从相机捕获视频相同,只需将相机索引更改为视频文件名即可。此外,在显示框架时,请使用适当的时间 cv.waitKey() 如果太少,视频会很快,如果太高,视频会很慢(嗯,这就是您可以慢动作显示视频的方式),在正常情况下,25 毫秒就可以了。

代码运行效果:

main.py 代码:

import numpy as np
import cv2 as cv

cap = cv.VideoCapture('vtest.mp4')

while cap.isOpened():
    ret, frame = cap.read()

    # 如果帧读取正确,ret 为 True
    if not ret:
        print('无法收到视频帧数据(该视频流是否已结束?),程序正在退出')
        break
    
    # 转换该视频帧为灰度图像
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 显示该帧
    cv.imshow('frame', gray)
    # 当按下键盘 q 时,退出程序
    if cv.waitKey(1) == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

示例代码打包下载:

示例原文参考:https://docs.opencv.org/4.5.5/dd/d43/tutorial_py_video_display.html

OpenCV-Python 捕捉摄像头视频帧,并进行展示

通常,我们必须用摄像头捕捉实时流。OpenCV 提供了一个非常简单的接口来执行此操作,让我们从摄像头中捕捉视频(我使用笔记本电脑上的内置网络摄像头),将其转换为灰度视频并显示。只需一个简单的任务即可开始。

要捕获视频,您需要创建一个VideoCapture对象。它的参数可以是设备索引或视频文件的名称。设备索引只是指定哪个相机的数字。通常会连接一台相机(如我的情况)。所以我只是传递0(或-1)。您可以通过传递 1 来选择第二个相机,依此类推。之后,您可以逐帧捕获。但最后,不要忘记释放捕获。

本示例运行效果:

mian.py 代码:

import numpy as np
import cv2 as cv

cap = cv.VideoCapture(0)
if not cap.isOpened():
    print('无法打开该摄像头')
    exit()

while True:
    # 逐帧捕捉
    ret, frame = cap.read()
    
    # 如果帧读取正确,ret 为 True
    if not ret:
        print('无法收到视频帧数据(该视频流是否已结束?),程序正在退出')
        break
    
    # 转换该视频帧为灰度图像
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 显示该帧
    cv.imshow('frame', gray)
    # 当按下键盘 q 时,退出程序
    if cv.waitKey(1) == ord('q'):
        break

# 当程序结束时,释放该摄像头资源
cap.release()
cv.destroyAllWindows()

本示例代码打包下载:

附参考教程原文:https://docs.opencv.org/4.5.5/dd/d43/tutorial_py_video_display.html

OpenCV-Python 读取图片、展示图片窗口、保存图片

本文通过 OpenCV-Python 对图片文件进行读取并弹出展示窗口进行展示该图片,当键盘按下s键时则会保存当前图片为png格式到当前程序 目录中。

文件结构如下:

main.py 代码如下:

import cv2 as cv
import sys

# 在本教程中,您将学习如何:

# 从文件中读取图像(使用cv::imread)
# 在 OpenCV 窗口中显示图像(使用cv::imshow)
# 将图像写入文件(使用cv::imwrite)


# 读取图片
img = cv.imread('starry_night.jpeg')
print(img)

if img is None:
    sys.exit("无法读取该图像")

# 弹出窗口显示图片
cv.imshow('窗口标题', img)
k = cv.waitKey(0)

# 如果按下 s 键,则保存当前图片为 png 格式在当前目录
if k == ord('s'):
    cv.imwrite('starry_night.png', img)

下载本示例代码包:

附参考教程原文:https://docs.opencv.org/4.5.5/db/deb/tutorial_display_image.html