안녕하세요. 코딩산책입니다.
다음은 웹캠을 활용한 색상 인식 및 그리기 실습입니다. 해당 미니프로젝트는 OpenCV와 Python을 사용하여 색상을 감지하고, 해당 색상이 감지된 위치에 포인트를 그려 그림을 생성하는 간단한 프로그램을 만드는 과정입니다. 이론적인 설명과 Python 코드를 통해 단계별로 프로젝트를 진행해 보겠습니다.
1. 프로젝트 개요
우리가 만들 프로젝트는 웹캠을 통해 특정 색상을 감지하고, 해당 색상의 위치에 점을 찍어 그림을 그리는 프로그램입니다. 이를 위해 다음과 같은 작업이 필요합니다.
- 웹캠을 통해 실시간 영상 수집: 웹캠에서 실시간으로 프레임을 받아오는 작업.
- 색상 감지: 이미지에서 특정 색상을 감지하고 해당 위치를 추적.
- 점 그리기: 감지된 색상의 위치에 점을 그려 그림을 그리는 작업.
이 프로젝트는 OpenCV를 활용하여 웹캠에서 이미지를 가져오고, HSV 색상 공간을 사용하여 다양한 색상을 감지한 후, 그 결과를 화면에 표시하는 과정을 포함합니다.
2. 색상 감지 이론
색상을 인식하기 위해 우리는 RGB 색상 공간 대신 HSV (Hue, Saturation, Value) 색상 공간을 사용합니다. HSV 색상 공간은 사람의 직관적인 색상 인식을 반영하기 때문에 특정 색상 범위를 더 쉽게 정의할 수 있습니다.
- Hue (색상): 색상의 종류를 나타내며, 0°는 빨간색, 120°는 초록색, 240°는 파란색을 의미합니다.
- Saturation (채도): 색상의 순도를 나타내며, 값이 클수록 색이 선명해집니다.
- Value (명도): 색의 밝기를 나타냅니다.
HSV 색상 공간에서 우리는 특정 색상의 범위를 설정하고, 해당 범위에 있는 색상을 마스크로 처리하여 감지합니다.
3. 프로젝트 소스코드
다음은 위에서 설명한 내용을 바탕으로 작성된 Python 코드입니다. 이 코드는 색상을 감지하고 그 위치에 점을 찍는 과정을 포함하고 있습니다.
import cv2
import numpy as np
import time
hsv_target_colors = {
'orange':[5, 107, 0, 19, 255, 255],
'purple':[133, 56, 0, 159, 156, 255],
'green':[57, 76, 0, 100, 255, 255],
}
bgr_target_colors = {
'orange':[51, 153, 255],
'purple':[255, 0, 255],
'green':[0, 255, 0],
}
color_trails = {
'orange':[],
'purple':[],
'green':[],
}
# Trajectory disappearance time and trajectory maximum length
trail_lifetime = 2
max_trail_length = 30
cap = cv2.VideoCapture(0)
def find_color(img_hsv, target_colors, trail_list):
current_time = time.time()
for key in trail_list:
lower = np.array(target_colors[key][0:3])
upper = np.array(target_colors[key][3:6])
trails = trail_list[key]
# Create a mask
mask = cv2.inRange(img_hsv, lower, upper)
# Color trajectory update
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if contours:
largest = max(contours, key=cv2.contourArea)
if cv2.contourArea(largest) > 500:
perimeter = cv2.arcLength(largest, True)
approx = cv2.approxPolyDP(largest, 0.02 * perimeter, True)
x, y, w, h = cv2.boundingRect(approx)
trails.append(((int(x+w//2), int(y+h//2)), current_time))
# Remove coordinates older than 5 seconds from trajectory
trails = [(pos, t) for pos, t in trails if current_time - t < trail_lifetime]
# List size limit
trails = trails[-max_trail_length:]
trail_list[key] = trails
return trail_list
def draw_on_canvas(canvas_bgr, trail_list, target_colors):
for key in trail_list:
for i in range(1, len(trail_list[key])):
cv2.line(canvas_bgr, trail_list[key][i - 1][0], trail_list[key][i][0], target_colors[key], 2)
while True:
ret, frame = cap.read()
if not ret:
break
canvas = np.zeros(frame.shape, dtype="uint8")
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
color_trails = find_color(hsv, hsv_target_colors, color_trails)
draw_on_canvas(canvas, color_trails, bgr_target_colors)
combined_view = np.hstack((frame, canvas))
cv2.imshow("Frame | Palette", combined_view)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
4. 소스코드 설명
- 웹캠 설정: cv2.VideoCapture(0)을 사용하여 웹캠에서 이미지를 실시간으로 가져옵니다.
- HSV 색상 범위 설정: hsv_target_colors 딕셔너리에서 각 색상의 최소, 최대 HSV 값을 정의합니다.
- 궤적 리스트: color_trails 검출된 각 색상의 좌표 정보와 시간정보를 저장합니다.
- 색상 감지 함수: find_color 주어진 색상을 감지하고 특정 색상이 있는 위치를 찾아 해당 위치를 반환합니다.
- 캔버스에 그리기 함수: draw_on_canvas 궤적 리스트에 저장된 좌표 정보를 사용해 선을 그려 화면에 표시합니다.
5. 결론
이 프로젝트를 통해 우리는 OpenCV와 Python을 사용하여 웹캠에서 실시간으로 이미지를 처리하고, 특정 색상을 감지하여 해당 색상에 맞는 그림을 그리는 방법을 배웠습니다. 이 코드를 확장하여 더 많은 색상을 감지하거나 다양한 도형을 그릴 수 있습니다.
해당 포스트가 유용하셨다면 하단의 좋아요와 구독하기 부탁드립니다. ^^
★ 모든 내용은 아래의 링크를 참조하였습니다. ★
'강의 (Lecture) > OpenCV 마스터 with Python (초급)' 카테고리의 다른 글
OpenCV + Python 엣지(Edge) 검출과 허프(Hough) 변환 (2) | 2024.10.21 |
---|---|
OpenCV + Python 필터와 컨볼루션 (0) | 2024.10.14 |
OpenCV + Python 색 공간 변환과 색상 검출 (2) | 2024.10.10 |
OpenCV + Python 이미지 자르기 및 크기 조정 (1) | 2024.10.09 |
OpenCV + Python 산술 연산과 논리 연산 (0) | 2024.10.08 |