본문 바로가기
강의 (Lecture)/OpenCV 마스터 with Python (초급)

OpenCV + Python 웹캠을 활용한 색상 인식 및 그리기 (실습)

by codingwalks 2024. 10. 11.
728x90
반응형

안녕하세요. 코딩산책입니다.

다음은 웹캠을 활용한 색상 인식 및 그리기 실습입니다. 해당 미니프로젝트는 OpenCV와 Python을 사용하여 색상을 감지하고, 해당 색상이 감지된 위치에 포인트를 그려 그림을 생성하는 간단한 프로그램을 만드는 과정입니다. 이론적인 설명과 Python 코드를 통해 단계별로 프로젝트를 진행해 보겠습니다.

 

1. 프로젝트 개요

우리가 만들 프로젝트는 웹캠을 통해 특정 색상을 감지하고, 해당 색상의 위치에 점을 찍어 그림을 그리는 프로그램입니다. 이를 위해 다음과 같은 작업이 필요합니다.

  • 웹캠을 통해 실시간 영상 수집: 웹캠에서 실시간으로 프레임을 받아오는 작업.
  • 색상 감지: 이미지에서 특정 색상을 감지하고 해당 위치를 추적.
  • 점 그리기: 감지된 색상의 위치에 점을 그려 그림을 그리는 작업.

이 프로젝트는 OpenCV를 활용하여 웹캠에서 이미지를 가져오고, HSV 색상 공간을 사용하여 다양한 색상을 감지한 후, 그 결과를 화면에 표시하는 과정을 포함합니다.

 

2. 색상 감지 이론

색상을 인식하기 위해 우리는 RGB 색상 공간 대신 HSV (Hue, Saturation, Value) 색상 공간을 사용합니다. HSV 색상 공간은 사람의 직관적인 색상 인식을 반영하기 때문에 특정 색상 범위를 더 쉽게 정의할 수 있습니다.

  • Hue (색상): 색상의 종류를 나타내며, 0°는 빨간색, 120°는 초록색, 240°는 파란색을 의미합니다.
  • Saturation (채도): 색상의 순도를 나타내며, 값이 클수록 색이 선명해집니다.
  • Value (명도): 색의 밝기를 나타냅니다.

HSV 색상 공간에서 우리는 특정 색상의 범위를 설정하고, 해당 범위에 있는 색상을 마스크로 처리하여 감지합니다.

 

OpenCV + Python 색 공간 변환과 색상 검출

안녕하세요. 코딩산책입니다.이번 글에서는 색 공간(Color Space)에 대해서, 특히 많이 사용되는 RGB, CMYK, HSV, YUV, CIELab 색 공간을 알아보도록 하겠습니다. 추가적으로 OpenCV 라이브러리를 활용

codingwalks.com

 

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을 사용하여 웹캠에서 실시간으로 이미지를 처리하고, 특정 색상을 감지하여 해당 색상에 맞는 그림을 그리는 방법을 배웠습니다. 이 코드를 확장하여 더 많은 색상을 감지하거나 다양한 도형을 그릴 수 있습니다.

 

해당 포스트가 유용하셨다면 하단의 좋아요와 구독하기 부탁드립니다. ^^

Buy me a coffee

 

[Codingwalks]에게 송금하기 - AQR

[Codingwalks]에게 송금하기 - AQR

aq.gy

★ 모든 내용은 아래의 링크를 참조하였습니다. ★

 

OpenCV: OpenCV-Python Tutorials

Core Operations In this section you will learn basic operations on image like pixel editing, geometric transformations, code optimization, some mathematical tools etc.

docs.opencv.org

728x90
반응형