안드로이드/안드로이드 with Java

Opencv Python - 3. 동영상 다루기

닥스훈스 2019. 9. 3. 14:48

카메라로부터 영상 가져오기

파이썬 파일을 생성하여 다음 코드를 작성한다.

import cv2

#비디오의 개수만큼 객체 생성
cap = cv2.VideoCapture(0)

#카메라로부터 이미지 한장을 가져옴
ret, img_color = cap.read()

cv2.imshow("Color", img_color)
#아무키나 누르기 전까지 대기
cv2.waitKey(0)

#자원 메모리 해제
cap.release()
cv2.destroyAllWindows()

 

다음과 같이 한장의 캡쳐 파일이 나타난다.

 

동영상 처럼 보이게 하기 위해서는 화면에 보여지는 처리를 반복해주면 된다.

import cv2

#비디오의 개수만큼 객체 생성
cap = cv2.VideoCapture(0)

#esc키를 누르면 무한루프에서 빠져나옴
while(True):
    ret, img_color = cap.read()

    #캡쳐가 되지 않은 경우 다시 루프 처음부터 실행하도록
    if ret == False:
        continue

    cv2.imshow("Color", img_color)
    #키보드 입력을 받기 위해서 대기시간 1초 줌
    if cv2.waitKey(1)&0xFF == 27:
        break

#아무키나 누르기 전까지 대기
cv2.waitKey(0)

#자원 메모리 해제
cap.release()
cv2.destroyAllWindows()

 

 

카메라 영상 저장하기

프레임수는 일반적으로 30이며 영상이 1초에 30장의 이미지를 가져올 수 있다는 의미이다.

import cv2

#비디오의 개수만큼 객체 생성
cap = cv2.VideoCapture(0)

#코덱 지정
fourcc = cv2.VideoWriter_fourcc(* 'XVID')
#(저장될 동영상 파일 이름, 코덱, 영상의 초당 프레임수, 이미지 크기 캡쳐되는 이미지와 일치시키기)
writer = cv2.VideoWriter('output.avi', fourcc, 30.0, (640, 480))


#esc키를 누르면 무한루프에서 빠져나옴
while(True):
    ret, img_color = cap.read()

    #캡쳐가 되지 않은 경우 다시 루프 처음부터 실행하도록
    if ret == False:
        continue

    cv2.imshow("Color", img_color)
    
    #이미지를 반복해서 저장
    writer.write(img_color)

    #키보드 입력을 받기 위해서 대기시간 1초 줌
    if cv2.waitKey(1)&0xFF == 27:
        break

#아무키나 누르기 전까지 대기
cv2.waitKey(0)

#자원 메모리 해제
cap.release()
writer.release()
cv2.destroyAllWindows()

 

영상 실행 후 ESC키를 누르면 영상이 종료되고 다음과 같이 파일로 저장된다.

영상파일에서 오른쪽 클릭 후, Show in Explorer를 선택한다.

 

영상을 열면 재생됨을 확인할 수 있다.

 

동영상 파일 재생하기

재생할 영상을 불러온 후, 영상이 끝까지 재생되면 무한루프에서 빠져나오도록 조건문을 걸어준다.

import cv2

#재생할 동영상 파일
cap = cv2.VideoCapture('output.avi')
fourcc = cv2.VideoWriter_fourcc(* 'XVID')

while(True):
    ret, img_color = cap.read()

    #동영상을 끝까지 재생하면 무한루프에서 빠져나옴
    if ret == False:
        break

    cv2.imshow("Color", img_color)

    #키보드 입력을 받기 위해서 대기시간 1초 줌
    if cv2.waitKey(1)&0xFF == 27:
        break

#자원 메모리 해제
cap.release()
cv2.destroyAllWindows()