무효 클릭 IP 추적 중...
머신러닝,딥러닝/opencv

[파이썬 opencv] 오픈cv 를 통해 비디오(영상) 출력하는 방법

꼬예 2022. 12. 2.

이번 포스팅에서는 opencv를 통해 영상 파일과 실시간 캠 영상을 출력하는 방법에 대해 알아보겠습니다.

 

1. 주요 클래스 및 함수 소개

1) 카메라 객체 생성

 VideoCapture 라는 클래스를 통해 캠 영상과 이미 완성되어 있는 영상파일을 출력할 수 있습니다.

 

(1) 실시간 캠영상

 

캠영상 객체생성

 

 VideoCapture 클래스 인자로 0부터 시작하는 정수 값을 넣습니다.

일반적으로 0은 컴퓨터의 기본 카메라인데요. 카메라가 두 개라면 하나는 0 다른 하나는 1로 설정을 합니다.

 

둘 중 어느 카메라가 할당될지는 상황에 따라 다를 수 있음으로 체크할 필요가 있습니다.

 

(2) 영상 파일 

앞서 정수를 넣었던 것과는 달리 영상파일 경로를 인자로 넣어주면 됩니다.

 

영상파일 읽어오는 함수

 

일반적으로  VideoCapure 을 통해 생성한 객체는  cap 이라는 변수명을 사용하니 참고 바랍니다.

 

2) 비디오 캡처 준비 여부 확인

 

영상 연결 확인 함수

 

카메라가 정상적으로 연결이 되었다면  True 값을 반환하고, 실패하였다면  False 를 반환하는 함수입니다.

 

3) 한 프레임씩 받아오기

 

프레임가져오는 함수

 

해당 함수를 통해 영상을 한프레임씩 가져옵니다.

 

 

2. 실제 사용 코드

이어서 위 함수들을 통해 실제 영상을 출력하는 예제 코드를 작성해보겠습니다.

 

각 함수 별 설명은 주석을 통해 달아 놨으니 확인 바랍니다.

cap = cv2.VideoCapture('John_Wick_small.mp4')


if not cap.isOpened(): # 카메라 잘연결되었는지 확인 후 실패했을시 에러메시지와 함께 종료
    print('Camera open failed!')
    sys.exit()
    
while True:
    ret, frame = cap.read() # 현재 open되어있는 영상에서 한프레임씩 이미지를 가져온다.
    # 두개 값을 리턴
	# ret => boolean 형태로 영상이 끝나면 False를 반환
	# frame은 한프레임 해당하는 영상을 의미 type은 numpy array형태
   
    if not ret: # ret이 False면 자연스럽게 영상이 꺼지도록 세팅
       break # 영상이끊기면 while loop를 빠져나온다.
   
    cv2.imshow('frame', frame) # 화면에 한프레임식 보여준다.
    
    # cv2.waitKey(20) 20은 20ms 의미 20ms딜레이를 가지고 다음 프레임을 보여준다.
    # 이렇게만 적으면 while loop을 중간에 빠져나올수 없기 때문에 아래와 같은 형태로 많이씀
    if cv2.waitKey(20) == 27: #27은 ESC키를 의미 , esc버튼을 누르면 강제로 영상을 중지하겠다는 뜻
        break 

    # if cv2.waitKey(20) == ord('q'): #27은 ESC키 외에 다른 키를 눌렀을때 중지하고 싶으면 ord를 감싸고 다른 키 문자를 넣어주면 됨.
        # break 
        
cap.release()
cv2.destroyAllWindows()# 모든 창 닫기

 

이외에도 Frame이 가지는 여러 가지 정보를 추출할 수 있습니다. 

대표적으로 프레임 크기를 알 수 있는데요.

 

프레임 크기 추출

 

 cap.get() 을 통해 가져온 값은  float 값입니다. 그렇기 때문에  int 형태로 변환하여 주로 사용합니다.

 

이외에도 다양한 속성 값 추출 법이 있으니 문서를 참조하시기 바랍니다.

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글