본문 바로가기
KDT/과제

[파이썬, Python] OpenCV - 동영상 2개를 이어 재생하기!

by coding-choonsik 2023. 8. 24.
728x90
반응형
SMALL

💡 문제 

1번 동영상이 끝나기 2초전 부터 2번 동영상이 좌측에서 시작되어 2초가 끝나면 2번 동영상이 모두 보이는 형태의 프로그램을 만들어보자.

import cv2
import numpy as np

cap1 = cv2.VideoCapture('cat1.mp4')
cap2 = cv2.VideoCapture('cat2.mp4')

frame_cnt1 = round(cap1.get(cv2.CAP_PROP_FRAME_COUNT))
frame_cnt2 = round(cap2.get(cv2.CAP_PROP_FRAME_COUNT))
print(frame_cnt1)
print(frame_cnt2)

fps1 = cap1.get(cv2.CAP_PROP_FPS)
fps2 = cap2.get(cv2.CAP_PROP_FPS)
print(fps1)
print(fps2)

w = round(cap1.get(cv2.CAP_PROP_FRAME_WIDTH))
h = round(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT))
print('w', w)
print('h', h)

fourcc= cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('cat.avi', fourcc, fps1, (w,h))

delay = int(1000/fps1)
effect_frame = int(fps1 * 2) # 2초

# 첫번째 영상
for i in range(frame_cnt1 - effect_frame):
    ret1, frame1 = cap1.read()
    cv2.imshow('output', frame1)
    out.write(frame1)
    if cv2.waitKey(delay) == 27:
        break

for i in range(effect_frame):
    ret1, frame1 = cap1.read() # 첫번째 영상의 나머지 2초 영상 읽기
    ret2, frame2 = cap2.read() # 두번째 영상의 처음 2초 영상 읽기
    # int(640 / 60) * 0 = 0
    # int(640 / 60) * 1 = 10
    # int(640 / 60) * 2 = 20
    # ...
    x = int(w / effect_frame) * i
    frame = np.zeros((h, w, 3), dtype=np.uint8) # 검정색 배경영상
    frame[:, 0:x, :] = frame2[:, 0:x, :]
    frame[:, x:w, :] = frame1[:, x:w, :]

    cv2.imshow('output', frame)
    out.write(frame)
    if cv2.waitKey(delay) == 27:
        break

# 두번째 영상
for i in range(effect_frame, frame_cnt2):
    ret2, frame2 = cap2.read()
    cv2.imshow('output', frame2)
    out.write(frame2)
    if cv2.waitKey(delay) == 27:
        break

cap1.release()
cap2.release()
out.release()

 

 

728x90
반응형
LIST