使用ls
命令列出/dev
目录下的设备文件,找到摄像头设备。通常,摄像头设备会以video
开头,如/dev/video0,如下图所示
。
ls /dev | grep video
找出可用的摄像头设备
通过ls /dev | grep video命令找出所有的摄像头设备,然后通过opencv去测试找到的摄像头能否采集帧图像,可以则写入1.txt文本里,程序运行完成后在写入的1.txt文本里就能找到可用的摄像机设备号了
import subprocess
import cv2
# 获得摄像头相关的列表
def get_video_device():
# 运行命令并捕获输出
result = subprocess.run(['ls', '/dev'], capture_output=True, text=True)
devices = result.stdout.split("\n")
video_device_list = []
for device in devices:
if "video" in device:
device = f'/dev/{device}'
video_device_list.append(device)
return video_device_list
# 尝试检查系统中的所有摄像头设备
for device_id in get_video_device(): # 假设系统中最多有10个摄像头设备,根据列出来的id遍历列表即可
cap = cv2.VideoCapture(device_id)
if cap.isOpened():
print(f"找到摄像头设备: {device_id}")
ret, frame = cap.read()
if ret:
# 如果摄像头可以打开并且可以读取帧,则保存到1.txt文本里
with open("1.txt",'w',encoding='utf-8') as f:
f.write(str(device_id))
# cv2.imshow(f'Camera {device_id}', frame)
else:
print(f"摄像头 {device_id} 无法读取帧")
else:
print(f"摄像头 {device_id} 无法打开")
cap.release() # 释放摄像头资源
# 等待所有窗口关闭
cv2.waitKey(0)
cv2.destroyAllWindows()
测试采集的视频是否正确
import cv2
# 输出视频文件路径
output_path = '/home/firefly/Project/px01/output_video.mp4'
# 打开视频文件
cap = cv2.VideoCapture(0)
# 获取视频的帧率和帧尺寸
fps = 30
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 设置结束时间
end_time = 5 # 结束时间(秒)
# 计算结束帧
end_frame = int(end_time * fps)
# 创建视频写入对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, fps, (frame_width, frame_height))
# 读取视频帧
frame_idx = 0
while frame_idx<end_frame:
ret, frame = cap.read()
if not ret:
break
out.write(frame) # 写入剪辑后的视频
frame_idx += 1
# 释放资源
cap.release()
out.release()