• Python使用CV2库捕获、播放和保存摄像头视频


    Python使用CV2捕获和保存摄像头视频

    关于cv2库的安装和使用基础可参见https://blog.csdn.net/cnds123/article/details/126547307

    特别提示:CV2指的是OpenCV2(Open Source Computer Vision Library),安装的时候是 opencv_python,但在导入的时候采用 import cv2。

    学习本文需要你的计算机有摄像头,笔记本一般内置有摄像头,若是台式机可以连接一个USB摄像头。

    捕获视频帧

    使用 OpenCV 可以捕获摄像头输出的视频流,并且可以对每一帧视频进行处理。下面是一个简单的示例代码,演示如何从摄像头中捕获视频帧并显示到屏幕上:

    1. import cv2
    2. #定义cv2.VideoCapture 类型的对象
    3. cap = cv2.VideoCapture(0)
    4. #isOpened() 用来判断是否捕获到视频
    5. if not cap.isOpened():
    6. print("无法打摄像机")
    7. exit()
    8. while True:
    9. # 如果正确读取帧,ret为True,cap.read() 方法从摄像头中读取一帧视频
    10. ret, frame = cap.read()
    11. if not ret:
    12. break
    13. # 显示帧视频
    14. cv2.imshow('frame', frame)
    15. # 按 'q' 键退出程序
    16. if cv2.waitKey(1) == ord('q'):
    17. break
    18. # 释放摄像头并关闭所有窗口
    19. cap.release()
    20. cv2.destroyAllWindows()

    说明,VideoCapture 对象传入了参数 0,表示设备索引,设备索引就是指定哪个摄像头的数字。正常情况下,一个摄像头会被连接(就像我的情况一样)。所以我简单地传0。你可以通过传递1来选择第二个相机,以此类推。

    运行效果如下:

    捕获视频帧保存

    把视频保存到本地,可以使用cv2.VideoWriter()方法,需要设置输出视频的文件名、编解码器、帧速率和帧大小等参数。VideoWriter() 有5个参数:

    参数1:输出文件名,例如: d:/output.mp4。

    参数2:FourCC 代码,FourCC 是用于指定视频编解码器的4字节代码。

    参数3:帧率的数量。

    参数4:帧大小。

    参数5:颜色标志。如果为 True,正常颜色输出,否则就是灰色图像输出。

    VideoWriter_fourcc()编码方法,常见的视频格式参数:

    cv2.VideoWriter_fourcc('M', 'P', '4', 'V')

    MPEG-4编码 .mp4 可指定结果视频的大小

    cv2.VideoWriter_fourcc('X','2','6','4')

    MPEG-4编码 .mp4 可指定结果视频的大小

    cv2.VideoWriter_fourcc('I', '4', '2', '0')

    该参数是YUV编码类型,文件名后缀为.avi 广泛兼容,但会产生大文件

    cv2.VideoWriter_fourcc('P', 'I', 'M', 'I')

    该参数是MPEG-1编码类型,文件名后缀为.avi

    cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')

    该参数是MPEG-4编码类型,文件名后缀为.avi,可指定结果视频的大小

    cv2.VideoWriter_fourcc('T', 'H', 'E', 'O')

    该参数是Ogg Vorbis,文件名后缀为.ogv

    cv2.VideoWriter_fourcc('F', 'L', 'V', '1')

    该参数是Flash视频,文件名后缀为.flv

    下面是一个简单的例子:

    1. import cv2
    2. # 打开摄像头
    3. cap = cv2.VideoCapture(0)
    4. if not cap.isOpened():
    5. print("无法打摄像机")
    6. exit()
    7. # 设置输出视频的参数
    8. fourcc = cv2.VideoWriter_fourcc(*'MP4V') # 其中*'MP4V'和 'M', 'P', '4', 'V'等效
    9. out = cv2.VideoWriter('d:/output.mp4', fourcc, 20.0, (640, 480))
    10. while True:
    11. # 读取视频帧
    12. ret, frame = cap.read()
    13. if not ret:
    14. break
    15. # 显示视频帧——播放视频
    16. cv2.imshow('frame',frame)
    17. # 将视频帧写入输出视频
    18. out.write(frame)
    19. # 按 'q' 键退出循环
    20. if cv2.waitKey(1) == ord('q'):
    21. break
    22. # 释放资源
    23. cap.release()
    24. out.release()
    25. cv2.destroyAllWindows()

    运行后,将在你指定的路径产生找到生成的文件,我这里是d:/output.mp4。

    最后,给出一个Python使用CV2库捕获摄像头视频,并使用tkinter做界面含有“抓拍”、“开始录制”、“停止录制”按钮的例子,

     源码如下:

    1. import cv2
    2. import tkinter as tk
    3. from PIL import Image, ImageTk
    4. # 创建主窗口
    5. root = tk.Tk()
    6. root.title("Camera App")
    7. # 创建画布,用于显示视频帧
    8. canvas = tk.Canvas(root, width=640, height=480)
    9. canvas.pack()
    10. # 创建按钮框架
    11. button_frame = tk.Frame(root)
    12. button_frame.pack(pady=10)
    13. # 拍照函数
    14. def take_snapshot():
    15. ret, frame = cap.read() # 读取当前帧
    16. if ret:
    17. cv2.imwrite("snapshot.jpg", frame) # 保存为图片名称snapshot.jpg
    18. print("Snapshot taken!")
    19. # 开始录像函数
    20. def start_recording():
    21. global is_recording, out
    22. ret, frame = cap.read() # 读取当前帧
    23. if ret:
    24. height, width, channels = frame.shape
    25. fourcc = cv2.VideoWriter_fourcc(*"XVID")
    26. out = cv2.VideoWriter("recording.avi", fourcc, 20.0, (width, height)) # 创建VideoWriter对象,视频名称recording.avi
    27. is_recording = True
    28. print("Recording started!")
    29. # 停止录像函数
    30. def stop_recording():
    31. global is_recording, out
    32. is_recording = False
    33. out.release() # 释放VideoWriter对象
    34. print("Recording stopped!")
    35. # 创建按钮
    36. snapshot_btn = tk.Button(button_frame, text="抓拍", command=take_snapshot)
    37. snapshot_btn.grid(row=0, column=0, padx=10)
    38. start_btn = tk.Button(button_frame, text="开始录制", command=start_recording)
    39. start_btn.grid(row=0, column=1, padx=10)
    40. stop_btn = tk.Button(button_frame, text="停止录制", command=stop_recording)
    41. stop_btn.grid(row=0, column=2, padx=10)
    42. # 打开摄像头
    43. cap = cv2.VideoCapture(0)
    44. is_recording = False
    45. # 更新视频帧函数
    46. def update_frame():
    47. global is_recording
    48. ret, frame = cap.read() # 读取当前帧
    49. if ret:
    50. if is_recording:
    51. out.write(frame) # 写入视频帧
    52. frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 将BGR转换为RGB
    53. img = Image.fromarray(frame) # 创建PIL图像对象
    54. img.thumbnail((640, 480)) # 缩放图像大小以适应画布
    55. img = ImageTk.PhotoImage(image=img) # 创建Tkinter图像对象
    56. canvas.create_image(0, 0, anchor=tk.NW, image=img) # 在画布上显示图像
    57. canvas.img = img # 保留对图像的引用
    58. root.after(10, update_frame) # 每10毫秒更新一次视频帧
    59. # 启动视频帧更新
    60. update_frame()
    61. # 运行主循环
    62. root.mainloop()

    注意抓拍到的图片(名称snapshot.jpg)和录制视频(名称recording.avi)路径和源码在同一目录中,,下次抓拍到的图片和录制视频,会覆盖前面的,你可以改进之。

  • 相关阅读:
    泽众云真机-平台即将升级支持华为机型HarmonyOS NEXT系统
    未找到 [“sitemapLocation“] 对应的 sitemap.json 文件
    以学工管理系统打造一体化智慧校园平台
    不同的时钟机制
    【算法】一文搞懂归并排序
    树莓派系统安装,使用SSD/U盘启动centos
    阳振坤:OceanBase 4.0 核心技术解读
    正则表达式
    MyBatisPlus 日志的两个坑:生产环境不打日志、多数据源日志配置等
    四川大学计算机考研资料汇总
  • 原文地址:https://blog.csdn.net/cnds123/article/details/130429491