[OpenCV] # 1. 동영상 & 카메라 출력 방법

Crush_on_Study·2022년 6월 21일
0

OpenCV공부

목록 보기
2/3

동영상 출력 방법

프레임에 대하여

동영상이라는 것은 여러 장의 '사진'을 1초 내에 여러 장을 출력시킴으로써 시청할 시, 연속적인 움직임을 보이도록 묘사하는 것입니다.

먼저 전체 코드와 출력 화면을 보여드리고 하나씩 설명드리겠습니다.

예제코드

#-*_coding:utf-8-*-
import cv2

video = cv2.VideoCapture("cat2.mp4")

while video.isOpened():
    check, frame = video.read()
    if not check:
        print("끝")
        break
    
    cv2.imshow("귀여운 고양이들",frame)
    if cv2.waitKey(25) == ord('q'):
        print("흑흑 종료")
        break
    
video.release()
cv2.destroyAllWindows()

  • 동영상 출력 방식 역시 이미지 출력과 비슷합니다.

이미지 출력함수가 imshow 였다면, 동영상은 VideoCapture 입니다. (대문자,소문자 유의하세요!)

  • 위 코드를 보면 동영상 제목을 "귀여운 고양이들" 이라고 했는데 openCV는 한글을 지원하지 않아서 제목이 ????? 라고 출력될 것입니다. 중요한 개념은 아니지만 영어로 쓰기로 합시다. 헤헿

isOpened , check, frame

isOpened가 뭔가요?

영어 뜻 그대로 열려져 있다 입니다. 즉, video 변수가 열려져있는 동안 ~~ 를 반복해라! 라고 이해할 수 있겠습니다.

  • ok, 근데 check랑 frame은 뭔가요?

이건 단지 변수명입니다. 다만, 직관적으로 이해하기 쉽게 변수명을 ret,frame 혹은 check,frame이라고 합니다. 이 변수들이 하는 일을 설명드리겠습니다.

  1. check : 말했듯이 동영상은 여러 장의 사진을 연속적으로 송출하는 것입니다. 이 Check가 하는 기능은 사진 송출이 끝났는지 아직 이뤄지고 있는지를 확인하는 변수입니다.

제 코드를 보면

if not check:
	print("끝")
    break

이렇게 나와있는데요. 만약 사진 송출이 끝났다면 "끝"을 출력하고 while문을 빠져나가도록 break를 걸었습니다.

  1. frame : 프레임의 정의는 아래와 같습니다.

그렇기 때문에 코드를 보면 cv2.imshow를 통해 받는 변수가 video가 아닌 frame입니다. 이 frame을 while문을 통해서 송출하는 것이기 때문입니다.

cv2.imshow("귀여운 고양이들",frame)

따라서 이러한 코드로 imshow를 받는 것입니다.


ord,release

동영상 중지버튼은?

  • 코드를 보면 waitKey와 함께 'ord'라는 함수가 보입니다.

ord는 프레임이 끝나지 않았지만, 도중에 영상을 중단하고 나가고자 할 때, 하는 것입니다.

  • release는 동영상을 송출하는데 사용한 메모리 자원을 해제할 때 쓰는 함수입니다. 약간 C언어에서 배운 malloc/free 함수와 비슷한 개념이라 보시면 될 것입니다.

카메라 (웹캡) 출력 방법

결과 화면

소스 코드

import cv2

webcam = cv2.VideoCapture(0) # 0번 카메라 (노트북의 경우 내장카메라)

if not webcam.isOpened():
    exit()

while True:
    check, frame = webcam.read()
    mirror = cv2.flip(frame,2)
    re_mirror = cv2.resize(mirror,dsize=(0,0),fx=0.5,fy=0.5,interpolation=cv2.INTER_AREA)
    if not check:
        break
    
    cv2.imshow("webcam",re_mirror)
    if cv2.waitKey(25) == ord('q'):
        print("오 너가 끈거야")
        break
    
re_mirror.release()
cv2.destroyAllWindows()
  • 웹캠 출력은 동영상 출력과 비슷합니다. 다만, 몇 가지 차이가 보이는데
    대표적인게 일단 카메라 넘버 세팅입니다.
cv2.VideoCapture(0) 

이것은 0번 카메라를 의미합니다. 0번은 만약 노트북을 사용하고 계시면 디폴트로 내장된 카메라를 가리킵니다. 추가로 다른 웹캠들도 설치하고 계시다면 1번, 2번 이런식으로 순서가 있을 것입니다.

저는 다른 웹캠은 없어서 0번을 적었고, 결과 화면처럼 나왔습니다.

  • 제 웹캠은 좌우반전이 되어있어서 flip함수를 이용해서 바꿔놨습니다. 또한, 크기도 큼지막하게 나와서 resize함수를 이용해서 바꿔놨는데, 이걸 다 지워놓으면 기본웹캠 사이즈로 나옵니다.

(flip,resize는 뒤에서 다룰 것입니다.)

  • while True:

만약 True를 통해 무한반복을 하지않으면 웹캠은 실시간이 아니라, 실행 당시의 화면만 캡쳐된 상태로 뜹니다. 이 부분만 제외하면 나머진 다 똑같습니다.

근데 waitKey(25)에서 25가 의미하는게 뭔가요?

  • 영상 재생 속도를 의미합니다.

25가 1배속을 의미합니다.

profile
방구석백수 코드몽키

0개의 댓글