首页 > 解决方案 > 在视频的特定时间提取帧并插入文本 OpenCV Python

问题描述

所以我有一个持续时间为 15 秒的视频,在特定时间我需要插入一个文本字段。到目前为止,我的代码只是读取视频并显示它。之后,我们提取帧并计算每帧的持续时间。

import cv2

import numpy as np

# Create a VideoCapture object and read from input file
# If the input is the camera, pass 0 instead of the video file name
cap = cv2.VideoCapture('my_baby_dog.mp4')

# Check if camera opened successfully
if (cap.isOpened() == False):
    print("Error opening video stream or file")

# Read until video is completed
while (cap.isOpened()):
    # Capture frame-by-frame
    ret, frame = cap.read()
    if ret == True:
        fps = cap.get(cv2.CAP_PROP_FPS)  # OpenCV2 version 2 used "CV_CAP_PROP_FPS"
        frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        duration = frame_count / fps

        print('fps = ' + str(fps))
        print('number of frames = ' + str(frame_count))
        print('duration (S) = ' + str(duration))
        minutes = int(duration / 60)
        seconds = duration % 60
        print('duration (M:S) = ' + str(minutes) + ':' + str(seconds))
        # Display the resulting frame
        frameWidth = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        frameHeight = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
        cv2.putText(img=frame, text='EKO', org=(int(frameWidth / 2 - 20), int(frameHeight / 2)),
                    fontFace=cv2.FONT_HERSHEY_DUPLEX, fontScale=3,
                    color=(0, 255, 0))
        cv2.imshow('Frame', frame)
        # Press Q on keyboard to  exit
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break

    # Break the loop
    else:
        break



# When everything done, release the video capture object
cap.release()

# Closes all the frames
cv2.destroyAllWindows()

标签: pythonopencvimage-processingvideo-processing

解决方案


听起来您想在 6 秒后添加文本覆盖。假设此覆盖将一直持续到视频完成,您将需要添加一个if语句来比较durationstart time的文本覆盖。然后显示它。

import cv2
import numpy as np

start_time = 6

# Create a VideoCapture object and read from input file
# If the input is the camera, pass 0 instead of the video file name
cap = cv2.VideoCapture('my_baby_dog.mp4')

........
while (cap.isOpened()):
    ........
        # ADD OVERLAY TEXT
        if start_time < duration:
            cv2.putText(img=frame, text='EKO', org=(int(frameWidth / 2 - 20), int(frameHeight / 2)),
                    fontFace=cv2.FONT_HERSHEY_DUPLEX, fontScale=3,
                    color=(0, 255, 0))
        cv2.imshow('Frame', frame)

同样,您可以像这样开始和停止文本覆盖

import cv2
import numpy as np

start_time = 6
stop_time = 10
    ........
        # ADD OVERLAY TEXT
        if start_time < duration < stop_time:
            cv2.putText(img=frame, text='EKO', org=(int(frameWidth / 2 - 20), int(frameHeight / 2)),
                    fontFace=cv2.FONT_HERSHEY_DUPLEX, fontScale=3,
                    color=(0, 255, 0))
        .......

推荐阅读