OpenCV를 활용한 실시간 웹캠 필터 만들기
1. 개요
오늘은 OpenCV를 활용하여 실시간으로 웹캠 영상을 처리하고 다양한 필터를 적용하는 방법을 알아보겠습니다. 이 프로젝트는 인스타그램이나 스냅챗과 같은 필터 효과를 간단하게 구현하는 것이 목표입니다. 실시간 영상에서 특정 효과를 적용하는 방법을 배우고, OpenCV의 다양한 기능을 활용할 수 있도록 하겠습니다.
2. 준비물
이 프로젝트를 진행하기 위해 다음과 같은 라이브러리가 필요합니다.
- OpenCV (
cv2) - NumPy (
numpy)
필요한 라이브러리는 다음 명령어를 사용하여 설치할 수 있습니다.
pip install opencv-python numpy
이제 OpenCV를 활용하여 실시간 웹캠 영상을 불러오고 필터를 적용하는 방법을 알아보겠습니다.
3. 실시간 웹캠 영상 불러오기
먼저 OpenCV를 사용하여 실시간으로 웹캠 영상을 불러오는 코드를 작성합니다.
import cv2
def webcam_display():
cap = cv2.VideoCapture(0) # 웹캠을 열기
if not cap.isOpened():
print("웹캠을 열 수 없습니다.")
return
while True:
ret, frame = cap.read()
if not ret:
print("프레임을 가져올 수 없습니다.")
break
cv2.imshow('Webcam', frame) # 프레임 출력
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
webcam_display()
이 코드에서는 cv2.VideoCapture(0)을 사용하여 기본 웹캠을 열고, cv2.imshow()를 통해 실시간 영상을 화면에 출력합니다. q 키를 누르면 종료됩니다.
4. 필터 적용하기
이제 영상에 필터를 적용하는 방법을 알아보겠습니다. 대표적으로 다음과 같은 필터를 적용할 수 있습니다.
4.1. 그레이스케일 필터
그레이스케일 필터를 적용하면 영상을 흑백으로 변환할 수 있습니다.
def grayscale_filter():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 그레이스케일 변환
cv2.imshow('Grayscale Filter', gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
grayscale_filter()
4.2. 가우시안 블러 필터
가우시안 블러 필터를 적용하면 영상이 부드럽게 흐려집니다.
def gaussian_blur_filter():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
blur = cv2.GaussianBlur(frame, (15, 15), 0) # 블러 처리
cv2.imshow('Gaussian Blur Filter', blur)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
gaussian_blur_filter()
4.3. 카툰 필터
카툰 필터를 적용하면 만화 스타일의 효과를 줄 수 있습니다.
def cartoon_filter():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 5)
edges = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9)
color = cv2.bilateralFilter(frame, 9, 300, 300)
cartoon = cv2.bitwise_and(color, color, mask=edges)
cv2.imshow('Cartoon Filter', cartoon)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
cartoon_filter()
5. 다양한 필터를 하나의 프로그램으로 통합하기
각 필터를 별도로 실행할 수도 있지만, 사용자가 원하는 필터를 선택할 수 있도록 프로그램을 만들 수도 있습니다.
def apply_filter(filter_type):
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
if filter_type == 'grayscale':
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
elif filter_type == 'blur':
frame = cv2.GaussianBlur(frame, (15, 15), 0)
elif filter_type == 'cartoon':
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 5)
edges = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9)
color = cv2.bilateralFilter(frame, 9, 300, 300)
frame = cv2.bitwise_and(color, color, mask=edges)
cv2.imshow('Filtered Webcam', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
filter_type = input("사용할 필터를 선택하세요 (grayscale, blur, cartoon): ")
apply_filter(filter_type)
6. 마무리
이제 OpenCV를 활용하여 실시간 웹캠 필터를 적용하는 방법을 배웠습니다. 이 코드를 확장하여 다양한 필터를 추가할 수도 있고, OpenCV의 얼굴 인식 기능과 결합하여 더욱 다양한 효과를 적용할 수도 있습니다.
'Python > OpenCV' 카테고리의 다른 글
| OpenCV와 OCR을 활용한 번호판 인식 (0) | 2025.11.20 |
|---|---|
| OpenCV 실전 프로젝트: 실시간 얼굴 스티커 추가 (Snapchat 스타일) (0) | 2025.11.19 |
| OpenCV를 활용한 얼굴 인식 (Haar Cascade, Dlib) (0) | 2025.11.17 |
| OpenCV에서 YOLO를 활용한 객체 탐지 (0) | 2025.11.16 |
| OpenCV에서 DNN 모듈을 활용한 이미지 분류 (0) | 2025.11.15 |