当前位置: 首页 > news >正文

基于pychrm工具的python读取 USB 摄像头(实时+保存录像+摄像头信息打印+镜像)—— OpenCV库

一、描述:

使用 Python 读取 USB 摄像头的代码示例,使用 OpenCV 库来实现摄像头捕获和显示功能。

1.首先需要安装 OpenCV 库

pip install opencv-python

2.功能说明

通过cv2.VideoCapture()打开指定索引的 USB 摄像头

  • 循环读取摄像头帧并显示在窗口中
  • 按 ‘q’ 键可以退出程序并释放资源

3.代码切换

  • 如果你的电脑有多个摄像头,可以尝试修改read_usb_camera()函数的参数,例如read_usb_camera(1)来切换到第二个摄像头。
import cv2def read_usb_camera(camera_index=0):"""读取USB摄像头并显示视频流参数:camera_index: 摄像头索引,默认0表示第一个摄像头"""# 打开摄像头cap = cv2.VideoCapture(camera_index)# 检查摄像头是否成功打开if not cap.isOpened():print("无法打开摄像头,请检查设备是否连接正确")returnprint("摄像头已打开,按 'q' 键退出")try:while True:# 读取一帧图像ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法接收帧,可能摄像头已断开连接")break# 显示帧cv2.imshow('USB Camera', frame)# 等待1毫秒,按q键退出if cv2.waitKey(1) == ord('q'):breakfinally:# 释放摄像头资源cap.release()# 关闭所有窗口cv2.destroyAllWindows()print("摄像头已关闭")if __name__ == "__main__":# 可以通过修改参数来选择不同的摄像头,例如1表示第二个摄像头read_usb_camera(0)

二、读取摄像头信息

  • 摄像头的信息(如支持的格式、分辨率(宽 / 高)、帧率、亮度、对比度等常用参数等),可以使用 OpenCV 库提供的相关方法。这些信息通常由摄像头硬件和驱动程序提供,不同设备支持的信息可能有所差异。有的信息读取不了。
import cv2def get_camera_info(camera_index=0):"""获取并显示摄像头的详细信息"""# 打开摄像头cap = cv2.VideoCapture(camera_index)if not cap.isOpened():print(f"无法打开索引为 {camera_index} 的摄像头")returntry:# 摄像头基本信息print(f"===== 摄像头 {camera_index} 信息 =====")# 支持的属性列表properties = [(cv2.CAP_PROP_FRAME_WIDTH, "帧宽度"),(cv2.CAP_PROP_FRAME_HEIGHT, "帧高度"),(cv2.CAP_PROP_FPS, "帧率(FPS)"),(cv2.CAP_PROP_BRIGHTNESS, "亮度"),(cv2.CAP_PROP_CONTRAST, "对比度"),(cv2.CAP_PROP_SATURATION, "饱和度"),(cv2.CAP_PROP_HUE, "色调"),(cv2.CAP_PROP_GAIN, "增益"),(cv2.CAP_PROP_EXPOSURE, "曝光度"),(cv2.CAP_PROP_FOURCC, "编码格式"),(cv2.CAP_PROP_FRAME_COUNT, "总帧数(仅文件)"),(cv2.CAP_PROP_MODE, "模式"),(cv2.CAP_PROP_CONVERT_RGB, "是否转换为RGB"),]# 打印各属性值for prop_id, prop_name in properties:value = cap.get(prop_id)# 特殊处理编码格式if prop_id == cv2.CAP_PROP_FOURCC:# 将四字符代码转换为字符串fourcc = int(value)codec = "".join([chr((fourcc >> 8 * i) & 0xFF) for i in range(4)])print(f"{prop_name}: {codec} (0x{fourcc:08x})")else:print(f"{prop_name}: {value}")# 尝试获取支持的分辨率(这部分因设备而异)print("\n===== 尝试获取支持的分辨率 =====")resolutions = []# 常见分辨率宽高比aspect_ratios = [(4, 3), (16, 9)]# 尝试一些常见分辨率(这是一种启发式方法,并非所有设备都支持)for width in range(320, 1921, 160):for height in range(240, 1081, 120):# 检查宽高比是否合理if any(abs(width / h - ar[0] / ar[1]) < 0.01 for ar inaspect_ratios) or width == 1920 and height == 1080:# 尝试设置分辨率cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)# 读取实际设置的分辨率actual_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)actual_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)if (actual_width, actual_height) not in resolutions:resolutions.append((int(actual_width), int(actual_height)))# 按宽度排序并显示resolutions.sort()for res in resolutions:print(f"{res[0]}x{res[1]}")finally:# 释放资源cap.release()if __name__ == "__main__":# 可以修改索引来获取不同摄像头的信息get_camera_info(0)
===== 摄像头 0 信息 =====
帧宽度: 640.0
帧高度: 480.0
帧率(FPS): 30.0
亮度: 0.0
对比度: 0.0
饱和度: 64.0
色调: 0.0
增益: 1.0
曝光度: -6.0
编码格式:     (0x00000016)
总帧数(仅文件): -1.0
模式: 1.0
是否转换为RGB: 1.0===== 尝试获取支持的分辨率 =====

三、实时视频流+保存录像MP4

读取 USB 摄像头的实时视频流,同时在窗口中显示预览画面,将视频以 MP4 格式保存到本地文件。

使用mp4v编码器(fourcc 代码),这是 MP4 格式的标准编码器之一;
通过cv2.VideoWriter类处理视频写入,保存的文件可以用大多数视频播放器直接打开;
camera_index:选择摄像头(多摄像头时使用),output_file:输出文件名,默认为 "output.mp4"
fps:视频帧率,默认为 30.0
import cv2
import timedef record_camera(camera_index=0, output_file="output.mp4", fps=30.0):"""读取USB摄像头并将视频以MP4格式保存参数:camera_index: 摄像头索引,默认0表示第一个摄像头output_file: 输出文件名,默认"output.mp4"fps: 视频帧率,默认30.0"""# 打开摄像头cap = cv2.VideoCapture(camera_index)# 检查摄像头是否成功打开if not cap.isOpened():print("无法打开摄像头,请检查设备是否连接正确")return# 获取摄像头的宽度和高度frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))print(f"开始录制视频,分辨率: {frame_width}x{frame_height},帧率: {fps}")print("按 'q' 键停止录制并保存")# 定义编码器并创建VideoWriter对象# 使用MP4V编码器,对应MP4格式fourcc = cv2.VideoWriter_fourcc(*'mp4v')out = cv2.VideoWriter(output_file, fourcc, fps, (frame_width, frame_height))try:start_time = time.time()while True:# 读取一帧图像ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法接收帧,可能摄像头已断开连接")break# 将帧写入输出文件out.write(frame)# 显示帧cv2.imshow('Recording - USB Camera', frame)# 计算录制时间并显示elapsed_time = time.time() - start_timeprint(f"录制中: {elapsed_time:.1f}秒", end='\r')# 等待1毫秒,按q键退出if cv2.waitKey(1) == ord('q'):breakfinally:# 释放资源cap.release()out.release()cv2.destroyAllWindows()# 显示最终录制信息total_time = time.time() - start_timeprint(f"\n录制完成!视频已保存为: {output_file}")print(f"总录制时间: {total_time:.1f}秒")if __name__ == "__main__":# 可以自定义输出文件名和帧率record_camera(0, "1.mp4", 30.0)

四、视频翻转

视频翻转功能可以实现水平翻转、垂直翻转或同时翻转,方便处理不同安装角度的摄像头。通过flip_code参数控制翻转方式:

flip_code=0:垂直翻转(上下颠倒)
flip_code=1:水平翻转(左右镜像,适合前置摄像头)
flip_code=-1:同时进行垂直和水平翻转
import cv2
import timedef record_camera_with_flip(camera_index=0,output_file="output.mp4",fps=30.0,flip_code=1  # 0: 垂直翻转, 1: 水平翻转, -1: 同时垂直和水平翻转
):"""读取USB摄像头并将视频以MP4格式保存,支持视频翻转功能参数:camera_index: 摄像头索引,默认0表示第一个摄像头output_file: 输出文件名,默认"output.mp4"fps: 视频帧率,默认30.0flip_code: 翻转方式,0=垂直翻转, 1=水平翻转, -1=同时翻转"""# 打开摄像头cap = cv2.VideoCapture(camera_index)# 检查摄像头是否成功打开if not cap.isOpened():print("无法打开摄像头,请检查设备是否连接正确")return# 获取摄像头的宽度和高度frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 确定翻转方式描述flip_description = {0: "垂直翻转", 1: "水平翻转", -1: "同时垂直和水平翻转"}.get(flip_code, "自定义翻转")print(f"开始录制视频,分辨率: {frame_width}x{frame_height},帧率: {fps},翻转方式: {flip_description}")print("按 'q' 键停止录制并保存")# 定义编码器并创建VideoWriter对象fourcc = cv2.VideoWriter_fourcc(*'mp4v')out = cv2.VideoWriter(output_file, fourcc, fps, (frame_width, frame_height))try:start_time = time.time()while True:# 读取一帧图像ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法接收帧,可能摄像头已断开连接")break# 翻转图像flipped_frame = cv2.flip(frame, flip_code)# 将翻转后的帧写入输出文件out.write(flipped_frame)# 显示翻转后的帧cv2.imshow('Recording - Flipped Camera', flipped_frame)# 计算录制时间并显示elapsed_time = time.time() - start_timeprint(f"录制中: {elapsed_time:.1f}秒", end='\r')# 等待1毫秒,按q键退出if cv2.waitKey(1) == ord('q'):breakfinally:# 释放资源cap.release()out.release()cv2.destroyAllWindows()# 显示最终录制信息total_time = time.time() - start_timeprint(f"\n录制完成!视频已保存为: {output_file}")print(f"总录制时间: {total_time:.1f}秒")if __name__ == "__main__":# 可以自定义参数,例如:# 水平翻转(适合前置摄像头镜像效果)record_camera_with_flip(0, "1.mp4", 30.0, flip_code=-1)# 如需垂直翻转,使用:# record_camera_with_flip(0, "vertical_flip.mp4", 30.0, flip_code=0)# 如需同时翻转,使用:# record_camera_with_flip(0, "both_flip.mp4", 30.0, flip_code=-1)
http://www.dtcms.com/a/338264.html

相关文章:

  • 【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks
  • 【高等数学】第九章 多元函数微分法及其应用——第七节 方向导数与梯度
  • Localhost和127.0.0.1
  • 数据库原理及应用_数据库基础_第2章关系数据库标准语言SQL_数据类型表操作(定义、操作和修改)
  • 终极方案!lightRag/graphRag离线使用tiktoken持续报错SSLError,不改源码,彻底解决!
  • MySQL和HiveSQL在查询上的区别
  • 上网行为管理
  • 用户认证与应用控制技术
  • 深入浅出 SQL:数据库操作的核心语言完全指南
  • 【c++】从灵活到规范:自定义消息机制的设计与实践
  • day10(练习题)
  • Three.js 动画循环学习记录
  • 6 webUI中图生图重绘方式--涂鸦、涂鸦重绘、局部重绘、上传蒙版重绘
  • 生成式引擎优化(GEO)AI搜索优化专家竞争力报告
  • 检测手绘图中不规则曲线交点的方法和一般规则线条交点的方法
  • rom定制系列------小米cc9机型 原生安卓15系统 双版线刷root 定制修改功能项
  • 力扣(分发糖果)
  • 【完整源码+数据集+部署教程】海洋垃圾与生物识别系统源码和数据集:改进yolo11-RVB
  • 深度优先遍历dfs(模板)
  • VS Code Copilot 完整使用教程(含图解)
  • 【笔记ing】考试脑科学 脑科学中的高效记忆法
  • 图论:Floyd算法
  • 从数学原理推导的角度介绍大语言MOE架构的本质
  • Linux系统WireShark抓取本地网卡报文
  • uv 现代化的虚拟环境管理工具
  • 量化线性层,将原始的fp16/bf16权重加载到Linear8bitLt模块中,调用int8_module.to(“cuda”)量化 (44)
  • 视频讲解:CatBoost、梯度提升 (XGBoost、LightGBM)对心理健康数据、交通流量及股票价格预测研究
  • Dubbo 的SPI
  • 深入解析RabbitMQ与AMQP-CPP:从原理到实战应用
  • IDEA 配置终端提示符样式,通过脚本方式