• opencv(python)视频按帧切片/cv2.VideoCapture()用法


    一、介绍

    cv2.VideoCapture是OpenCV中一个用于捕捉视频的类。它可以访问计算机的摄像头,或从视频文件中读取图像。通过cv2.VideoCapture,用户可以轻松地捕捉、保存、编辑和传输视频流数据。

    使用cv2.VideoCapture可以实现以下功能:

    1. 打开计算机的摄像头,实时捕捉摄像头的视频流数据。
    2. 读取视频文件,逐帧解码并输出视频流数据。
    3. 控制帧率,调整视频的播放速度。
    4. 控制视频的长宽和分辨率。
    5. 编辑视频流数据,比如添加水印、合并视频等操作。
    6. 传输视频数据,可以通过网络传输视频流数据。

    cv2.VideoCapture中最常用的方法有:

    1. read():读取视频流数据中的一帧。
    2. isOpened():检查当前的cv2.VideoCapture是否已经打开。
    3. release():释放cv2.VideoCapture对象占用的资源。

    例如以下代码展示如何使用cv2.VideoCapture对象打开计算机的摄像头并捕获实时视频:

    1. import cv2
    2. cap = cv2.VideoCapture(0)  # 打开计算机的摄像头
    3. while True:
    4.     ret, frame = cap.read()  # 读取视频流数据中的一帧
    5.     cv2.imshow('frame', frame)  # 显示捕获的视频流数据
    6.     if cv2.waitKey(1) & 0xFF == ord('q'):
    7.         break
    8. cap.release()  # 释放占用的资源
    9. cv2.destroyAllWindows()

    二、cv2.VideoCapture()视频的获取操作

    1、从文件读取视频

    参数是视频文件路径,打开方式如下:

    videoCapture = cv2.VideoCapture(“../test1.mp4”) #.avi等视频文件

    2、从摄像头读取视频

     VideoCapture(0)中参数是0,表示打开笔记本的内置摄像头,如果有多个摄像头,往上加就可。

    videoCapture = cv2.VideoCapture(0)
    如果要读取监控摄像头的视频流,需要知道指定摄像头的ip等信息。
    
    1. # 使用rtsp流打开相机
    2. videoCapture = cv2.VideoCapture(f'rtsp://{username}:{password}@{ip}:{port}/h264/ch1/main/av_stream')

    三、videoCapture.read()按帧读内容

    1. # 读帧
    2. success, frame = videoCapture.read()
    3. print(success)
    4. print(frame)
    success,frame是获.read()方法的两个返回值。 其中success是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
    

    下面这个示例中,我们使用了默认摄像头(设备编号为0)作为输入,然后使用while循环逐帧读取视频并在窗口中显示。如果按下 'q' 键或无法读取视频,则退出循环并释放资源。

    1. import cv2
    2. # 创建 VideoCapture 对象
    3. cap = cv2.VideoCapture(0)
    4. # 循环读取视频流
    5. while True:
    6. # 逐帧读取视频
    7. ret, frame = cap.read()
    8. # 如果不能读取视频,退出循环
    9. if not ret:
    10. break
    11. # 在窗口中显示视频帧
    12. cv2.imshow("frame", frame)
    13. # 检测键盘输入,按 'q' 键退出循环
    14. key = cv2.waitKey(1)
    15. if key == ord('q'):
    16. break
    17. # 释放资源并关闭窗口
    18. cap.release()
    19. cv2.destroyAllWindows()

    什么是帧,帧的快慢是什么,影响什么
            视频的基本组成部分是帧(frame),即一系列静态图像,这些图像在一定速率下以连续的方式播放,形成动态图像,例如30帧/秒。视频每秒的帧数被称为帧率(Frame Rate),通常用“fps”(Frames Per Second)表示。例如,30fps表示视频每秒钟包含30帧图像。帧率决定了视频的流畅度和真实感。较高的帧率可以使视频看起来更加流畅,因为它们可以更快地刷新图像。例如,60fps的视频比30fps的视频看起来更加流畅。此外,较高的帧率还可以减少视频中的模糊和颤动,因为它们可以更好地捕捉运动。但较高的帧率会导致文件变大和编解码更复杂,因为需要处理更多的帧图像。
    ————————————————
    https://blog.csdn.net/cvxiayixiao/article/details/130519349

    四、实例

    1. import os
    2. import cv2
    3. # 定义保存图片函数
    4. # image:要保存的图片
    5. # pic_address:图片保存地址
    6. # num: 图片后缀名,用于区分图片,int 类型
    7. def save_image(image, address, num):
    8. pic_address = address + str(num) + '.jpg'
    9. cv2.imwrite(pic_address, image)
    10. def video_to_pic(video_path, save_path, frame_rate):
    11. # 读取视频文件
    12. # video_path为视频路径,save_path为保存图片路径,frame_rate可以设置多少帧切一张图
    13. global videoCap
    14. #这里将videoCapture加global意思是设置成了全局变量,后面释放摄像头要用到这个变量
    15. videoCap = cv2.VideoCapture(video_path)
    16. if videoCap.isOpened():
    17. print("摄像头or视频打开成功")
    18. if not videoCap.isOpened():
    19. print("找不到摄像头or视频")
    20. exit()
    21. # 读帧
    22. success, frame = videoCap.read()
    23. """success,frame是获.read()方法的两个返回值。 
    24. 其中success是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。
    25. frame就是每一帧的图像,是个三维矩阵。"""
    26. # print(success)
    27. # print(frame)
    28. if videoCap.open(video_path):
    29. print("视频提取成功")
    30. if not videoCap.open(video_path):
    31. print("can not open the video")
    32. j = 0
    33. i = 0
    34. while success:
    35. i = i + 1
    36. # 每隔固定帧保存一张图片
    37. if i % frame_rate == 0:
    38. j = j + 1
    39. save_image(frame, save_path, j)
    40. print('图片保存地址:', save_path + str(j) + '.jpg')
    41. success, frame = videoCap.read()
    42. # if cv2.waitKey(1) & 0xFF == ord('q'):
    43. # break
    44. if __name__ == '__main__':
    45. # 视频文件和图片保存地址
    46. SAMPLE_VIDEO = 'F:/Capture/dist/video/sc0914.mp4'
    47. SAVE_PATH = 'F:/Capture/dist/VideotoImages/sc0914/'
    48. #注意保存本地路径不能有中文,save_image()以及imwrite、cv2.imread()均不支持有中文的路径
    49. if not os.path.exists(SAVE_PATH):
    50. os.makedirs(SAVE_PATH)
    51. # 设置固定帧率
    52. FRAME_RATE = 10
    53. video_to_pic(SAMPLE_VIDEO, SAVE_PATH, FRAME_RATE)
    54. # 调用release()释放摄像头
    55. # 调用destroyAllWindows()关闭所有图像窗口。
    56. videoCap.release()
    57. cv2.destroyAllWindows()

  • 相关阅读:
    kdxf speex
    Win系统使用DINO训练自己数据集
    【Java 进阶篇】JSP 内置对象详解
    大数据Hadoop高可用
    架构,平台,框架的区别和联系
    暴力递归转动态规划(十)
    正则表达式常见的应用场景
    LeetCode 814 二叉树剪枝[dfs] HERODING的LeetCode之路
    JVM:(五)运行时数据区之虚拟机栈
    3D建模设计软件犀牛7--Rhinoceros 7 Mac
  • 原文地址:https://blog.csdn.net/m0_63172128/article/details/132733548