Python 라이브러리는 서로 독립적이기 때문에 하나의 애플리케이션을 개발할 때 목적에 맞게 여러 라이브러리를 자유롭게 조합해 사용할 수 있습니다. 이번 예제에서는 OpenCV와 Tkinter 라이브러리를 함께 활용하여, 웹캠에서 캡처한 영상을 Tkinter 창에 실시간으로 표시하는 GUI 애플리케이션을 만들어 보겠습니다. OpenCV는 컴퓨터 비전과 이미지 처리 작업에 널리 사용되는 대표적인 Python 라이브러리입니다.
필요한 패키지 설치
애플리케이션을 만들기 전에 로컬 환경에 OpenCV가 설치되어 있어야 하고, Python Pillow(PIL) 패키지도 미리 준비되어 있어야 합니다. 아래 명령어를 실행하면 두 패키지를 손쉽게 설치할 수 있습니다.
pip install opencv-python
pip install Pillow
애플리케이션의 동작 원리
설치가 완료되면 애플리케이션의 구조와 GUI를 구성할 수 있습니다. 이 애플리케이션의 핵심 기능은 OpenCV를 사용해 웹캠(카메라 장치)을 여는 것입니다. 캡처된 각 프레임을 창에 표시하기 위해 Python Pillow(PIL) 패키지를 사용합니다. PIL은 OpenCV가 반환하는 NumPy 배열 형태의 프레임을 이미지 객체로 변환하며, 변환된 이미지는 Label 위젯에 할당되어 반복적으로 화면에 출력됩니다. 이 과정이 짧은 간격으로 계속 반복되면서 마치 동영상처럼 보이는 것입니다.
예제 코드
# 필요한 라이브러리 임포트
from tkinter import *
from PIL import Image, ImageTk
import cv2
# Tkinter 윈도우(프레임) 인스턴스 생성
win = Tk()
# 윈도우 크기 설정
win.geometry("700x350")
# 비디오 프레임을 담을 Label 생성
label = Label(win)
label.grid(row=0, column=0)
cap = cv2.VideoCapture(0)
# 프레임을 표시하는 함수 정의
def show_frames():
# 최신 프레임을 가져와 BGR을 RGB로 변환한 뒤 이미지로 변환
cv2image = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2RGB)
img = Image.fromarray(cv2image)
# 이미지를 PhotoImage로 변환
imgtk = ImageTk.PhotoImage(image=img)
label.imgtk = imgtk
label.configure(image=imgtk)
# 20ms 간격으로 반복 호출하여 영상을 연속 재생
label.after(20, show_frames)
show_frames()
win.mainloop()
실행 결과
위 코드를 실행하면 웹캠이 자동으로 켜지고, 캡처된 영상이 Tkinter 창에 실시간으로 표시됩니다. after(20, show_frames) 부분의 숫자를 조절하면 프레임 갱신 주기를 변경할 수 있으며, 값이 작을수록 더 부드러운 영상을 얻을 수 있습니다.
