1.乌班图server 20.04,无需qt 


注意:需要有/dev/video0 文件才可以,可能不是video0

若docker 容器里可以用docker-copose

devices:

  - "/dev/video0:/dev/video0"

 

import cv2 as cv

cap = cv.VideoCapture(0)
if not cap.isOpened():
    print("Cannot open camera")
    exit()

frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv.CAP_PROP_FPS))
# 生成mp4
fourcc = cv.VideoWriter_fourcc(*'mp4v')
out = cv.VideoWriter('/mnt/nas/share/report/output.mp4', fourcc, fps, (frame_width,frame_height))
# 生成avi
#out = cv.VideoWriter('/home/yys/share/output.avi', cv.VideoWriter_fourcc('M','J','P','G'), fps, (frame_width,frame_height))

count = 0
while count < 10 * fps:
    ret, frame = cap.read()

    if not ret:
        break

    out.write(frame)

    count += 1

cap.release()
out.release()

以下是对上面代码的简要分条描述:

- 导入OpenCV库并创建一个名为cv的别名
- 使用cv.VideoCapture()函数创建一个名为cap的视频捕获对象,并打开默认的摄像头(ID为0)
- 检查捕获对象是否成功打开,如果未打开,则输出“Cannot open camera”并退出程序
- 使用cap.get()函数获取视频帧的宽度、高度和帧率,并将其分别存储在frame_width、frame_height和fps变量中
- 使用cv.VideoWriter_fourcc()函数创建一个名为fourcc的视频编解码器对象,将其设置为mp4v格式
- 使用cv.VideoWriter()函数创建一个名为out的视频编写对象,将其设置为输出到名为“/home/yys/share/output.mp4”的文件中,使用fourcc编解码器,帧率为fps,视频分辨率为(frame_width, frame_height)
- 创建一个名为count的变量,用于计算写入视频文件的帧数
- 在while循环中,使用cap.read()函数读取摄像头的当前帧,将返回值存储在名为ret和frame的变量中
- 如果ret为False,则退出循环
- 使用out.write()函数将帧写入输出文件
- 将count增加1
- 循环结束后,释放摄像头和视频编写对象的资源,关闭程序


2.持续录制

实现了一个持续运行的视频捕获程序,它会不断从默认摄像头捕获10秒长的视频片段,并将这些视频片段保存到电脑的E:\luzhi目录下。每个视频文件的命名格式基于当前的日期和时间,确保文件名的唯一性。这个程序适合于需要自动化长时间监控和记录的场景

import cv2
import time
from datetime import datetime
import os
def save_video(cap, filename):
    start_time = time.time()
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter(filename, fourcc, 20.0, (640, 480))
    while True:
        ret, frame = cap.read()
        if ret:
            out.write(frame)
            if time.time() - start_time > 10:  # 10秒后停止录制
                break
        else:
            break
    out.release()

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

while True:
    filename = datetime.now().strftime("%Y年%m月%d日%H时%M分%S秒") + '.avi'

    save_video(cap, os.path.join(r'E:\luzhi',filename))

cap.release()
cv2.destroyAllWindows()