본문 바로가기
Python

[Python] OpenCV로 영상 캡쳐 및 녹화

by teamnova 2023. 5. 29.
728x90

안녕하세요. 이번에는 Python과 OpenCV로 영상을 캡쳐하고 녹화하는 예제를 진행하겠습니다.

OpenCV란 "Open Source Computer Vision"의 약자로, 컴퓨터 비전과 이미지 처리에 사용되는 오픈 소스 라이브러리 입니다.

 

영상의 어느 부분을 캡쳐해서 이미지로 저장하고 싶거나 영상의 어느 구간만 녹화해서 영상으로 저장하고 싶을때, OpenCV 라이브러리를 사용하여 해결할 수 있습니다.

 

 영상 파일 하나를 가져와서 진행해보겠습니다.

 

예제 코드는 다음과 같습니다. 주석을 참고해주세요.

import datetime  # 캡처 이미지나 녹화 영상을 저장할때 현재 일시로 기록하는데 사용할 datetime 모듈을 가져오기.
import cv2  # OpenCV를 사용하기 위해 cv2 모듈을 가져오기.

# 영상 파일을 캡처하기 위해 캡처할 영상파일 경로를 입려한 VideoCapture 객체를 생성합니다.
capture = cv2.VideoCapture("Video/video_1.mp4")
# 녹화할 영상의 코덱을 설정하기 위해 fourcc 변수를 초기화합니다. 여기서는 XVID 코덱을 사용합니다.
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# 녹화 상태를 나타내는 변수로, 초기에는 False로 설정합니다.
record = False

# 무한 반복문을 시작합니다.
while True:
	
    # 영상 파일이 재생 중 마지막 프레임에 도달했을때 다시 처음부터 재생하기 위해 파일을 열어줍니다.
    if(capture.get(cv2.CAP_PROP_POS_FRAMES) == capture.get(cv2.CAP_PROP_FRAME_COUNT)):
        capture.open("Video/video_1.mp4")

    # 영상에서 하나의 프레임을 읽어옵니다.
    # 'ret'을 제대로 읽었는지 여부를 나타내는 불리언 값이고,
    # 'frame'은 읽어온 프레임입니다.
    ret, frame = capture.read()
    # 읽어온 프레임을 'VideoFrame' 이라는 이름의 창에 표시합니다.
    cv2.imshow("VideoFrame", frame)

    # 현재 날짜와 시간을 'now' 변수에 저장합니다.
    now = datetime.datetime.now().strftime("%d_%H-%M-%S")
    
    # 사용자의 키보드 입력을 33밀리초 간격으로 확인합니다.
    key = cv2.waitKey(33)

    # 키보드 입력이 확인되었습니다.
    if key == 27:  # ESC
        break # 프로그램을 종료합니다.
    elif key == 26:  # Ctrl+Z
        print("캡쳐")
        # 프레임을 이미지로 캡처하고 (현재 날짜와 시간).png 형식의 이미지 파일로 저장합니다.
        cv2.imwrite("Video/" + str(now) + ".png", frame)
    elif key == 24:  # Ctrl+X
        print("녹화 시작")
        # 영상 녹화를 시작합니다.
        # 'record' 변수에 True를 저장해서 녹화가 진행되도록 합니다.
        record = True
        # 영상을 저장하는 VideoWriter 객체를 생성합니다.
        # 녹화된 영상 파일 이름은 (현재 날짜와 시간).avi 형식으로 저장합니다.
        # 'fourcc' 변수에 설정한 코덱을 사용합니다. 7번 줄에서 설정했습니다.
        # 초당 프레임 수는 20.0입니다.
        # 마지막 매개변수는 녹화 영상의 너비와 높이로, 녹화할 영상의 너비와 높이를 사용합니다.
        video = cv2.VideoWriter("Video/" + str(now) + ".avi", fourcc, 20.0, (frame.shape[1], frame.shape[0]))
    elif key == 3:  # Ctrl+C
        print("녹화 중지")
        # 'record' 변수에 False를 저장하여 녹화가 중지되도록 합니다.
        record = False
        # VideoWriter 객체를 해제합니다.
        # 녹화가 끝난 후에는 해당 객체를 해제해야 리소스를 반환할 수 있습니다.
        video.release()
        
    # 'record' 변수에 True가 저장되어 있을 경우, 즉 녹화 중인 경우에
    if record == True:
    	# 현재 프레임을 'video' 변수에 설정된 영상에 추가합니다.
    	# 그래서 영상이 녹화되는 동안 프레임이 지속적으로 저장됩니다.
        video.write(frame)

capture.release() # VideoCapture 객체를 해제합니다. 영상 캡처가 끝난 후에는 해당 객체를 해제해야 리소스를 반환할 수 있습니다.
cv2.destroyAllWindows() # 이 프로그램으로 열린 모든 창을 닫습니다.

 

키의 값은

27 = ESC

26 = Ctrl + Z

24 = Ctrl + X

3 = Ctrl + C

를 의미합니다.

 

ESC를 눌렀을 경우, 프로그램을 종료합니다.

Ctrl + Z 를 눌렀을 경우, 현재 화면을 캡쳐하고 cv2.imwrite(경로, frame) 에 적힌 경로에 저장합니다.

Ctrl + X 를 눌렀을 경우, 녹화를 시작합니다. cv2.VideoWriter(경로, fourcc, 10.0, (frame.shape[1], frame.shape[0])) 에 적힌 경로에 저장합니다.

 

영상 녹화 한번, 캡쳐 한번을 진행한 결과는 다음과 같습니다.

 

Ctrl + Z 를 한번 눌러서 22_21-48-35.png 이름을 가진 캡처 이미지 파일이 저장되었고,

Ctrl + X 를 눌러서 영상 녹화를 시작하고 Ctrl + C 를 눌러서 영상 녹화를 종료하여 22_21-48-27.avi 이름을 가진 영상 파일이 저장되었습니다.