opencv + python打开usb相机,录制视频并保存及读取视频

本文介绍如何使用Python和OpenCV录制视频并将其保存到本地文件的方法,同时演示了如何从本地文件读取并播放该视频。
部署运行你感兴趣的模型镜像

1.录制视频并保存


import datetime   #显示时间所需模块
import cv2
 
#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter(".\\out1.mp4",fourcc,25,(640,480))
 
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)  #设置窗口大小
 
#获取视频设备
cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture("文件地址")   从文件获取视频
flag = 0 
while cap.isOpened():    #判断摄像头是否已打开,若打开返回值则为True
    #从摄像头读视频帧
    ret,frame = cap.read()
    if ret ==True : #判断是否读取到数据
        #将视频帧在窗口中显示
        #函数执行开始时间

        timer = cv2.getTickCount()
    
        #计算fps
    
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer)
    
        #显示提示信息(图像,文字内容,坐标,字体,大小,颜色,字体厚度) #cv2.LINE_AA为抗锯齿,看起来会平滑一些   
        cv2.putText(frame, "FPS : " + str(int(fps)), (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.85, (150, 170, 50), 2, cv2.LINE_AA)
    
        #显示时间    
        datet = str(datetime.datetime.now())[0:19]    
        cv2.putText(frame, "Time:" + datet, (100, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.85,(0, 255, 255), 2, cv2.LINE_AA)
        if flag ==0:   
            cv2.putText(frame, "image collecting~" , (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.85,(0, 255,  ), 2, cv2.LINE_AA)
        cv2.imshow('video',frame)
        cv2.resizeWindow('video',640,480)  #重新设置窗口大小
        #写数据到多媒体文件
        key = cv2.waitKey(1)
        # print('flag ==')
        # print(flag)
        if flag ==1:
            # print('开始保存图像')
            cv2.putText(frame, "image saving~" , (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.85,(0, 255, 0), 2, cv2.LINE_AA)
            cv2.imshow('video',frame)
            cv2.resizeWindow('video',640,480)  #重新设置窗口大小                      
            cv2.waitKey(1 )
            vw.write(frame) 
        if key == 32:#按空格键开始保存图像
            vw.write(frame)
            flag = 1      
        # key = cv2.waitKey(1000)
        elif (key &0xFF == ord('s')): #按s键停止保存图像
            flag =0
            print('停止保存图像')
        elif(key & 0xFF == ord('q')):#按q键退出
            print('结束采集图像')
            break
    else:
        break
#释放资源
cap.release() #释放VideoCapture
vw.release() #释放VideoWrite
cv2.destroyAllWindows()  #释放窗口资源

2.读取保存的视频

# -*- coding: utf-8 -*-
from openni import openni2
import numpy as np
import cv2


cv2.namedWindow('video',cv2.WINDOW_NORMAL)
video = cv2.VideoCapture('.\\out1.mp4')
while video.isOpened():
    open,frame = video.read()
    # print(open)
    if open:
        # gray = cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)
        # cv2.imshow('video',gray)
        # key =cv2.waitKey(10)
        # if key ==27:
        cv2.imshow('video',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
video.release() #释放VideoCapture

cv2.destroyAllWindows()  #释放窗口资源

录制效果如下:
在这里插入图片描述
当无法正常工作时,通常是由于摄像头的兼容性或驱动问题。

  1. 尝试使用 CAP_DSHOW 后端
    在 Windows 系统中,MSMF 后端有时可能会出现问题,你可以使用 DirectShow (CAP_DSHOW) 后端代替。修改代码如下:

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
CAP_DSHOW 通常在 Windows 系统上兼容性更好。尝试这个后端看看是否能解决问题。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 我们参考用户提供的引用[1]和引用[2]中的代码,这两个引用都涉及使用OpenCVPython来捕获USB摄像头视频保存。用户的需求是查找使用Python调用相机录制存储视频的方法。 我们将结合这两个引用,补充一些必要的说明和注意事项,来回答用户的问题。 步骤: 1. 导入必要的库:主要是OpenCV (cv2) 2. 创建VideoCapture对象来捕获摄像头视频流。 3. 创建VideoWriter对象来写入视频文件。 4. 循环读取摄像头帧,显示写入文件,直到用户中断。 5. 释放资源。 注意:OpenCV主要处理视频画面,如果要录制声音,需要额外的处理(如引用[1]中使用了单独的录音进程和FFmpeg合)。 由于用户没有特别提到声音,我们先提供一个纯视频录制的版本,然后补充说明如何加入音频。 此外,引用[2]提到在Windows上使用CAP_DSHOW后端可能更稳定,我们可以添加这个选项。 以下是基本的实现代码(仅视频): </think> ### Python调用相机录制存储视频的实现方法 以下是使用OpenCV-Python库实现USB摄像头视频录制和存储的完整方案,结合了引用[1][2]的最佳实践: #### 基础实现代码 ```python import cv2 import datetime def record_video(output_filename='output.mp4', duration=10): # 使用DirectShow后端提高兼容性(Windows系统) cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # CAP_DSHOW解决兼容性问题[^2] # 设置视频参数(根据摄像头支持的分辨率调整) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = 30.0 # 创建VideoWriter对象(H.264编码) fourcc = cv2.VideoWriter_fourcc(*'H264') # 或使用'MP4V' out = cv2.VideoWriter(output_filename, fourcc, fps, (width, height)) start_time = datetime.datetime.now() while cap.isOpened(): ret, frame = cap.read() if not ret: print("无法获取帧") break # 写入视频文件 out.write(frame) # 显示实时画面 cv2.imshow('Camera Recording', frame) # 按ESC退出或达到录制时长 if (cv2.waitKey(1) & 0xFF == 27) or \ ((datetime.datetime.now() - start_time).seconds >= duration): break # 释放资源 cap.release() out.release() cv2.destroyAllWindows() print(f"视频保存至: {output_filename}") if __name__ == "__main__": # 生成带时间戳的文件名 filename = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') + '.mp4' record_video(output_filename=filename, duration=30) # 录制30秒 ``` #### 关键实现细节 1. **摄像头初始化** - 使用`cv2.CAP_DSHOW`参数解决Windows兼容性问题[^2] - 通过`set()`方法设置分辨率(支持的值取决于摄像头) - 通过`get()`获取实际分辨率用于编码器设置 2. **视频编码配置** - 推荐编码器:`H264`(高质量)或`MP4V`(兼容性好) - 常用帧率:30fps(流畅动作)或25fps( PAL制式地区) 3. **音频录制方案** 引用[1]展示了音视频同步录制的方法: ```python # 补充音频录制(需安装ffmpeg) import subprocess # 启动音频录制 audio_proc = subprocess.Popen( ['ffmpeg', '-f', 'dshow', '-i', 'audio=麦克风名称', 'temp.wav'] ) # 视频录制完成后合 subprocess.run([ 'ffmpeg', '-i', 'temp.mp4', '-i', 'temp.wav', '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', 'final_output.mp4' ]) ``` #### 常见问题解决 1. **摄像头无法打开** ```python # 尝试不同摄像头索引 for i in range(0, 3): cap = cv2.VideoCapture(i, cv2.CAP_DSHOW) if cap.isOpened(): print(f"使用摄像头索引: {i}") break ``` 2. **帧率提升技巧** ```python # 降低分辨率可提高FPS cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 使用MJPEG格式(如果摄像头支持) cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG')) ``` 3. **文件损坏处理** ```python # 强制释放资源(异常处理中) try: # 录制代码... finally: if 'cap' in locals(): cap.release() if 'out' in locals(): out.release() ``` #### 优化建议 1. 使用线程分离视频采集和显示 2. 添加动态比特率控制(如`cv2.VIDEOWRITER_PROP_QUALITY`) 3. 实现分段存储(按时间/文件大小分割) 4. 添加时间戳/文字水印功能
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值