728x90
반응형
아래와 같이 동영상 두 개를 붙여 새로운 영상을 만들어 볼 것이다.

구현 할 기능
- 두 개의 동영상 동시 열기
- 첫 번째 동영상의 마지막 N개 프레임과 두 번째 동영상의 처음 N개 프레임을 합성
- 합성된 영상을 동영상으로 저장하기
import sys
import numpy as np
import cv2
import os
os.chdir('C:\coding\OpenCV\ch02') # can't open/read file: check file path/integrity 오류 해결을 위해 경로 설정
# 두 개의 동영상을 열어서 cap1, cap2로 지정
cap1 = cv2.VideoCapture('video1.mp4')
cap2 = cv2.VideoCapture('video2.mp4')
if not cap1.isOpened() or not cap2.isOpened():
print('video open failed!')
sys.exit()
# 두 동영상의 크기, FPS는 같다고 가정함
frame_cnt1 = round(cap1.get(cv2.CAP_PROP_FRAME_COUNT)) # video1의 전체 frame 수
frame_cnt2 = round(cap2.get(cv2.CAP_PROP_FRAME_COUNT)) # video2의 전체 frame 수
fps = cap1.get(cv2.CAP_PROP_FPS) # 24
effect_frames = int(fps*2) # 첫 동영상의 뒷부분 2초와 두번째 동영상 뒷부분 2초 부분 겹쳐져 효과 줄 예정
print('frame_cnt1:', frame_cnt1) # frame_cnt1: 85
print('frame_cnt2:', frame_cnt2) # frame_cnt2: 121
print('FPS:', fps) # fps: 24.0
delay = int(1000 / fps)
w = round(cap1.get(cv2.CAP_PROP_FRAME_WIDTH))
h = round(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
# 출력 동영상 객체 생성
out = cv2.VideoWriter('output.avi', fourcc, fps, (w, h))
# vidoe1 복사
for i in range(frame_cnt1 - effect_frames): # video1의 시작 ~ 종료 2초 전
ret1, frame1 = cap1.read()
if not ret1:
print('frame read error!')
sys.exit()
out.write(frame1)
print('.', end='')
cv2.imshow('output', frame1)
cv2.waitKey(delay)
# video1 뒷부분과 video2 앞부분을 합성
for i in range(effect_frames):
ret1, frame1 = cap1.read()
ret2, frame2 = cap2.read()
if not ret1 or not ret2:
print('frame read error!')
sys.exit()
dx = int(w / effect_frames) * i
frame = np.zeros((h, w, 3), dtype=np.uint8)
frame[:, 0:dx, :] = frame2[:, 0:dx, :] # 영상 겹치는 부분의 왼쪽(video2)
frame[:, dx:w, :] = frame1[:, dx:w, :] # 영상 겹치는 부분의 오른쪽(video1)
out.write(frame)
print('.', end='')
cv2.imshow('output', frame)
cv2.waitKey(delay)
# video2 복사
for i in range(effect_frames, frame_cnt2):
ret2, frame2 = cap2.read()
if not ret2:
print('frame read error!')
sys.exit()
out.write(frame2)
print('.', end='')
cv2.imshow('output', frame2)
cv2.waitKey(delay)
print('\noutput.avi file is successfully generated!')
cap1.release()
cap2.release()
out.release()
cv2.destroyAllWindows()
Fade Out
Fade Out을 적용하고 싶다면 합성 부분에 아래와 같이 코드를 작성하면 된다.
위처럼 frame을 계산하지 않아도 cv2.addWeighted 함수를 통해 화면 전환을 자연스럽게 할 수 있다.
for i in range(effect_frames):
ret1, frame1 = cap1.read()
ret2, frame2 = cap2.read()
if not ret1 or not ret2:
print('frame read error!')
sys.exit()
# Fadeout
alpha = i / effect_frames
frame = cv2.addWeighted(frame1, 1 - alpha, frame2, alpha, 0)
out.write(frame)
print('.', end='')
cv2.imshow('output', frame)
cv2.waitKey(delay)
728x90
반응형
'OpenCV' 카테고리의 다른 글
| OpenCV 영상처리 - 산술 및 논리 연산 (0) | 2024.03.18 |
|---|---|
| OpenCV 영상처리 - 밝기 조절 (0) | 2024.03.18 |
| OpenCV 트랙바(cv2.createTrackbar) (0) | 2024.03.16 |
| OpenCV 연산 시간 측정(cv2.TickMeter) (0) | 2024.03.16 |
| OpenCV 키보드, 마우스 이벤트 처리 (0) | 2024.03.16 |