728x90
반응형
동영상은 일련의 정지 영상을 압축하여 파일로 저장한 형태를 의미
이 때 동영상에 저장되어있는 일련의 정지 영상을 프레임(frame)이라고 함
따라서 동영상을 처리하는 방법은 동영상에서 프레임을 추출한 후, 각각의 프레임에 영상 처리 기법을 적용하는 것
→ 웹캠도 동일하게 카메라로부터 일정 시간 간격으로 정지 영상 프레임을 받아와서 처리
OpenCV에서는 VideoCapture라는 클래스를 이용하여
카메라 또는 동영상 파일로부터 정지 영상 프레임을 받아올 수 있음
1. 동영상 파일 읽어와서 재생하기
import cv2
videoFile = '../datasets/video2_meat.mp4' #read video file
cap = cv2.VideoCapture(videoFile) #load as a VideoCapture class
while(cap.isOpened()): #Check Video is Available
ret, frame = cap.read() #read by frame (ret=TRUE/FALSE)
if ret:
cv2.imshow('VIDEO', frame)
if cv2.waitKey(10) & 0xFF == ord('q'): #wait 10ms until user input
break
else:
print("ret is false")
break
cap.release() #release memory
cv2.destroyAllWindows() #destroy All Window
- 비디오 파일이 위치해있는 경로를 videoFile 변수에 저장
- VideoCapture 클래스를 사용하여 cap 객체로 비디오를 불러온다
- 동영상이 cap 객체로 정상적으로 불러와졌으면 while문을 돌면서 각 프레임별로 재생한다
- cap.read(): 동영상을 프레임 별로 읽는다. 정상적으로 불러와졌으면 ret에는 TRUE 값이 저장되고, 그렇지 않으면 FALSE 값이 저장된다
- cv2.waitKey(10) & 0xff == ord('q'): 키보드 'q' 입력이 들어올 때까지 10ms 대기. 괄호 안의 숫자가 커지면 영상 재생 속도가 느려지고, 숫자가 작아지면 영상 재생 속도가 빨라진다
- cap.release(): 영상 재생이 끝나면 cap 객체가 차지하고 있던 메모리를 해제한다
- cv2.destroyAllWindows(): 켜져있던 모든 윈도우 재생창을 종료한다
2. 웹캠 재생하기
import cv2
cap = cv2.VideoCapture(0) #load WebCamera
print('width:', cap.get(3), ' height:', cap.get(4))
while(cap.isOpened()): #Check Video is Available
ret, frame = cap.read() #read by frame (ret=TRUE/FALSE)
if ret:
cv2.imshow('VIDEO', frame)
if cv2.waitKey(1) & 0xFF == ord('q'): #wait 10ms until user input
break
else:
print("ret is false")
break
cap.release() #release memory
cv2.destroyAllWindows() #destroy All Window
- 웹캠을 불러와 재생하는 것도 비디오 재생과 크게 다르지 않다! VideoCapture() 함수에 동영상 경로가 아닌 0을 넣어주면 보통 카메라, 웹캠으로 연결된다
- print를 사용하여 웹캠의 가로, 세로 길이를 확인할 수도 있다
- 이후의 내용은 동영상 불러오기와 동일하다
3. 웹캠 영상을 좌우 반전시켜 저장하기
import cv2
#Load Web Camera
cap = cv2.VideoCapture(0) #load WebCamera
if not (cap.isOpened()):
print("File isn't opend!!")
#Set Video File Property
videoFileName = 'output.avi'
w = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # width
h = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) #height
fps = cap.get(cv2.CAP_PROP_FPS) #frame per second
fourcc = cv2.VideoWriter_fourcc(*'DIVX') #fourcc
delay = round(1000/fps) #set interval between frame
#Save Video
out = cv2.VideoWriter(videoFileName, fourcc, fps, (w,h))
if not (out.isOpened()):
print("File isn't opend!!")
cap.release()
sys.exit()
#Load frame and Save it
while(True): #Check Video is Available
ret, frame = cap.read() #read by frame (ret=TRUE/FALSE)s
if ret:
inversed = cv2.flip(frame, 1) #inversed frame
out.write(inversed) #save video frame
cv2.imshow('Original VIDEO', frame)
cv2.imshow('Inversed VIDEO', inversed)
if cv2.waitKey(delay) == 27: #wait 10ms until user input 'esc'
break
else:
print("ret is false")
break
cap.release() #release memory
out.release() #release memory
cv2.destroyAllWindows() #destroy All Window
- 웹캠으로 입력받은 동영상을 저장하는 코드이다. 우선 두번째 예제와 같이 VideoCapture(0)을 사용하여 웹캠으로 동영상을 입력받을 수 있도록 로드한다
- 동영상을 저장하는데 필요한 속성들을 세팅한다
기본적으로 파일명, 가로, 세로, fps, fourcc를 지정해준다 - 앞서 지정한 속성들과 VideoWriter 클래스를 사용하여 영상을 저장할 수 있도록 객체를 생성한다
- 이후에는 앞서 진행한 과정과 동일하게 While문을 돌면서 프레임별로 접근한다
이 때, OpenCV에 내장되어 있는 flip 메소드를 사용하여 좌우반전 시켜주도록 한다.
파라미터를 1로 주면 좌우반전이고, 0으로 주면 상하반전이다 - write()메소드를 통해 프레임을 저장한다. 이 때 영상만 저장되고, 소리를 저장되지 않음에 유의하도록 한다
- 27번, 즉 ESC 키의 입력이 있을 때까지 웹캠을 계속해서 입력받으며, ESC의 입력이 있을 때는 while문을 빠져나가도록 한다
- 모든 작업이 끝나면, release()를 통해 메모리를 해제하고 destoryAllWindows()를 통해 창을 종료한다
마지막 코드는 길어서 복잡해보이지만
하나하나 뜯어보면 실상 그렇게 어려운 코드는 아니다
침착하게 하나씩 볼 수 있도록 해보자 :)
728x90
반응형
'Dev > PYTHON 파이썬' 카테고리의 다른 글
[python] 문자열에서 여러 문자 바꾸기 | 문자열 치환 | replace | transmake | translate | 정규표현식 | sub | re (0) | 2023.01.21 |
---|---|
[Python] 여러 장의 이미지를 numpy 배열로 로드 (image to numpy) (1) | 2022.01.06 |
[OpenCV] 파이썬으로 동영상 프레임 초단위 저장/캡처하기 (Save Video Frame per Second by Python) (4) | 2022.01.04 |
파이썬 가상환경(Virtual Environments) 설치/생성/복제/삭제 (0) | 2021.10.28 |
[파이썬 프로젝트#1-1] 파이썬이란? (0) | 2020.09.06 |