OpenCV(Open Source Computer Vision)는 컴퓨터 비전 작업을 위해 가장 널리 사용되는 오픈소스 파이썬 라이브러리입니다. 내장된 다양한 함수와 메서드를 통해 인공지능(AI)·머신러닝(ML) 프로젝트에서 이미지 및 영상 처리 기능을 손쉽게 구현할 수 있습니다. 얼굴 검출, 객체 인식, X-ray 영상 분석 등 산업 전반에서 폭넓게 활용되고 있습니다.
Tkinter 라이브러리와 결합하면 OpenCV를 핵심 엔진으로 사용하는 대화형 데스크톱 애플리케이션을 만들 수 있습니다. 이 글에서는 웹캠 영상을 GUI 창에 실시간으로 출력하는 간단한 애플리케이션을 만들어 보겠습니다.
1. 사전 준비: 라이브러리 설치
애플리케이션을 개발하려면 로컬 환경에 OpenCV가 설치되어 있어야 하고, Python Pillow(PIL) 패키지도 함께 준비되어 있어야 합니다. 터미널 또는 노트북 환경에서 아래 명령어를 실행해 설치할 수 있습니다.
pip install opencv-python pip install Pillow
※ 패키지 이름은 'open-cv'가 아닌 opencv-python을 사용해야 정상적으로 설치됩니다.
2. 애플리케이션 동작 원리
이 애플리케이션의 핵심 기능은 OpenCV로 웹캠을 열어 캡처한 프레임을 화면에 계속해서 보여주는 것입니다. 전체 동작 흐름은 다음과 같습니다.
① cv2.VideoCapture(0)으로 웹캠을 엽니다.
② cap.read()로 최신 프레임을 읽어옵니다.
③ OpenCV는 BGR 색상 순서를 사용하므로 cv2.cvtColor()로 RGB로 변환합니다.
④ Pillow의 Image.fromarray()로 프레임을 이미지 객체로 변환합니다.
⑤ ImageTk.PhotoImage()로 Tkinter에서 표시 가능한 형태로 바꾼 뒤 Label 위젯에 할당합니다.
⑥ after() 메서드로 일정 간격마다 함수를 반복 호출해 연속 재생 효과를 냅니다.
3. 전체 예제 코드
# 필요한 라이브러리 임포트
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)
# PIL 이미지를 Tkinter용 PhotoImage 객체로 변환
imgtk = ImageTk.PhotoImage(image=img)
label.imgtk = imgtk # 참조를 유지해야 이미지가 사라지지 않음
label.configure(image=imgtk)
# 20밀리초 후 함수를 다시 호출해 연속 캡처
label.after(20, show_frames)
show_frames()
win.mainloop()4. 코드 핵심 포인트
label.imgtk = imgtk : PhotoImage 객체를 변수에 저장하지 않으면 파이썬의 가비지 컬렉터가 이미지를 회수해 화면이 표시되지 않을 수 있습니다. 반드시 참조를 유지해야 합니다.
after(20, show_frames) : 20밀리초 간격으로 함수를 재호출하여 마치 동영상처럼 부드럽게 표시됩니다. 이 호출은 함수 내부에 위치해야 반복 실행되며, 값이 클수록 프레임 전환이 느려집니다.
VideoCapture(0) : 인자 0은 기본 웹캠을 의미합니다. 여러 대의 카메라가 연결된 경우 1, 2 등의 인덱스로 변경하면 됩니다.
5. 실행 결과
위 코드를 실행하면 700×350 크기의 창이 열리고, 사용자의 웹캠에 연결되어 실시간으로 캡처되는 영상 프레임이 화면에 표시됩니다.
