简体   繁体   English

如何使用 OpenCV 更改视频中的单个帧?

[英]How can I change a single frame in a video using OpenCV?

I have a video that I built using OpenCV VideoWriter.我有一个使用 OpenCV VideoWriter 构建的视频。

I want to change a specific frame with a different one.我想用不同的框架改变一个特定的框架。 Is there a way to do it without rebuilding the entire video?有没有办法在不重建整个视频的情况下做到这一点?

I am changing the third frame by making all pixels to zeros.我通过使所有像素为零来更改第三帧。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

frame_number = -1

while(True):
    frame_number += 1
    ret, frame = cap.read()
    if frame_number == 3:  # if frame is the third frame than replace it with blank drame
      change_frame_with = np.zeros_like(frame)
      frame = change_frame_with
    out.write(frame)

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

If you do not want to go through all the frames again:如果您不想再次浏览所有帧:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

frame_number = -1

while(True):
    frame_number += 1
    ret, frame = cap.read()
    if frame_number == 3:  # if frame is the third frame than replace it with blank drame
      change_frame_with = np.zeros_like(frame)
      frame = change_frame_with
      out.write(frame)
      break                # add a break here
    else:
      out.write(frame)

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()
  • But the above solution will not write all the other frames after 3 to the whole new video但是上述解决方案不会将3之后的所有其他帧写入整个新视频

This might help you :)这可能会帮助你:)

import cv2 as cv
vid = cv.VideoCapture('input.mp4')
total_frames = last_frame_number =  vid.get(cv.CAP_PROP_FRAME_COUNT)

fourcc = cv.VideoWriter_fourcc(*'avc1')
writer = cv.VideoWriter("output.mp4", apiPreference=0,fourcc=fourcc,fps=video_fps[0], frameSize=(width, height))

frame_number = -1

while(True):
 frame_number += 1
 vid.set(1,frame_number)
 ret, frame = vid.read()
 if not ret  or frame_number >= last_frame_number: break
 # check these two lines first
 if frame_number == changeable_frame_number :
   frame = new_img_to_be_inserted
 writer.write(frame)

 # frame = np.asarray(frame)
 gray = cv.cvtColor(frame, cv.IMREAD_COLOR)
 # cv.imshow('frame',gray)
 if cv.waitKey(1) & 0xFF == ord('q'):
    break

vid.release()
writer.release()
cv.destroyAllWindows()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM