基于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)