美文网首页
OpenCV学习笔记(2):间隔截取视频帧

OpenCV学习笔记(2):间隔截取视频帧

作者: 逍遥_yjz | 来源:发表于2021-09-06 15:08 被阅读0次

1. 帧率

帧率(FPS):每秒钟播放的帧数

两种方法,上代码

rtsp = 'videoData/test_video.flv'
# 初始化摄像头
cap = cv2.VideoCapture(rtsp)

fourcc = cv2.VideoWriter_fourcc(*'XVID')
fps = cap.get(5)  # 这个是获取视频帧率
print(fps)  # 25.0
print(cap.get(cv2.CAP_PROP_FPS))  # 25.0

2. 计算视频时长

# 2. 计算视频时长
def get_video_duration(filename):
  cap = cv2.VideoCapture(filename)
  if cap.isOpened():
    rate = cap.get(5)
    frame_num =cap.get(7)
    duration = frame_num/rate
    return duration
  return -1
fileName = "videoData/test_video.flv" 
duration = get_video_duration(fileName)
print(duration) # 89.68 秒

1. 通过帧数间隔截取视频帧

1.如果你想直接**通过帧数间隔截取**视频帧,那直接使用可以使用下面的代码:**

# 3. 通过帧数间隔截取视频帧
def capturePictureOnFrames(fileName):
    c = 1
    frameRate = 100  # 帧数截取间隔(每隔100帧截取一帧)
    cap = cv2.VideoCapture(fileName)
    print(cap.isOpened())
    while (True):
        ret, frame = cap.read()
        if ret:
            if (c % frameRate == 0):
                print("开始截取视频第:" + str(c) + " 帧")
                # 这里就可以做一些操作了:显示截取的帧图片、保存截取帧到本地
                cv2.imwrite("./capture_image/" + str(c) + '.jpg', frame)  # 这里是将截取的图像保存在本地
            c += 1
            cv2.waitKey(0)
        else:
            print("所有帧都已经保存完成")
            break
           
capturePictureOnFrames(fileName)
image-20210906145253247

2. 通过时间间隔截取

1. 如果你想**通过时间间隔截取**视频帧,可以做一个时间到帧数的变换:**

假如你想每隔10秒截取一帧,那么就相当于你要每隔( FPS * 10 )帧截取一帧图像!

# 4. 通过时间间隔截取
def capturePictureOnTimes(fileName):
    cap = cv2.VideoCapture(fileName)
    c = 1
    timeRate = 10  # 截取视频帧的时间间隔(这里是每隔10秒截取一帧)
    FPS = cap.get(5)
    while (True):
        ret, frame = cap.read()
        if ret:
            frameRate = int(FPS) * timeRate  # 因为cap.get(5)获取的帧数不是整数,所以需要取整一下(向下取整用int,四舍五入用round,向上取整需要用math模块的ceil()方法)
            if (c % frameRate == 0):
                print("开始截取视频第:" + str(c) + " 帧")
                # 这里就可以做一些操作了:显示截取的帧图片、保存截取帧到本地
                cv2.imwrite("./capture_image/" + str(c) + '.jpg', frame)  # 这里是将截取的图像保存在本地
            c += 1
            cv2.waitKey(0)
        else:
            print("所有帧都已经保存完成")
            break
    cap.release()
image

3. 生成连续视频文件

直接上代码

# coding: utf-8
import datetime
import cv2
import os

#rtsp = 'rtsp://admin:admin@191.164.3.160:554/1/1'
rtsp = 'videoData/test_video.flv'
# 初始化摄像头
cap = cv2.VideoCapture(rtsp)

fourcc = cv2.VideoWriter_fourcc(*'XVID')
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = cap.get(5)  # 这个是获取视频帧率
frame_count = 0
count = 0
while cap.isOpened():
    isSuccess, frame = cap.read()
    if isSuccess:
        if frame_count % 120 == 0 or frame_count == 0:
            frame_count = 0
            count += 1
            i = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
            filename = 'continuityVideo/'+str(i) + '-' + str(count) + '.avi'
            print(filename)
            video_writer = cv2.VideoWriter(filename, fourcc, fps, size)

    video_writer.write(frame)
    frame_count = frame_count + 1
    print(frame_count)
    if isSuccess:
        cv2.imshow('show', frame)
    else:
        video_writer.release()
        portion = os.path.splitext(filename)
        newname = portion[0] + '.mp4'
        os.rename(filename, newname)
        break
    if frame_count % 120 == 0:
        video_writer.release()
        portion = os.path.splitext(filename)
        newname = portion[0] + '.mp4'
        os.rename(filename, newname)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

输出结果:

image-20210906150238808

相关文章

网友评论

      本文标题:OpenCV学习笔记(2):间隔截取视频帧

      本文链接:https://www.haomeiwen.com/subject/eagewltx.html