본문 바로가기
Python

[Python] OpenCV로 특정 색을 인식하기

by teamnova 2023. 8. 15.
728x90

안녕하세요.

이번 시간에는 Python으로 OpenCV를 사용해서 특정 색을 인식하는 예제를 진행해보겠습니다.

 

색깔을 분별하는 방법은 HSV로 했습니다. HSV는 색상(H), 채도(S), 명도(V)의 값을 주어서 색을 표현하는 방법입니다.

다음 그림과 같이 HSV 색 공간을 원뿔로 표현할 수 있습니다.

 

HSV 색 공간 원뿔 모형

 

예제를 진행해보겠습니다.

먼저 인식하고자 하는 색의 HSV 범위를 입력합니다.

예제에서는 범위를 H(15),S(150),V(20) ~ H(35),S(255),V(255) 로 주어서 노란색을 인식하도록 했습니다.

 

 

예제 코드입니다.

import cv2
import numpy as np

# numpy 배열로 hsv 형식의 색 범위를 정해줍니다.
# 노란색으로 범위를 정해주었습니다.
lower = np.array([15, 150, 20])
upper = np.array([35, 255, 255])

# 카메라를 연결합니다.
webcam_video = cv2.VideoCapture(0)


while True:
 	# 카메라의 프레임을 읽고 가져옵니다.
    success, video = webcam_video.read()
   
   	# RGB 형식의 카메라 프레임을 HSV 형식으로 변환합니다.
    img = cv2.cvtColor(video, cv2.COLOR_BGR2HSV) 
    
    # 정한 범위 내의 색을 표시해줍니다.
    mask = cv2.inRange(img, lower, upper) 
    
    # 표시된 것에서 윤곽선을 찾습니다.
    mask_contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
    
    # 모든 윤곽선의 위치를 찾습니다.
    if len(mask_contours) != 0:
        for mask_contour in mask_contours:
            if cv2.contourArea(mask_contour) > 500:
                x, y, w, h = cv2.boundingRect(mask_contour)
                # 사각형을 그려줍니다.
                cv2.rectangle(video, (x, y), (x + w, y + h), (0, 0, 255), 3) 
                
    
    cv2.imshow("mask image", mask)
    cv2.imshow("window", video)
    
    # ESC 키를 누르면 프로그램이 종료됩니다.
    if cv2.waitKey(1) & 0xFF == 27:
        break

webcam_video.release()
cv2.destroyAllWindows()

 

 

결과는 다음과 같습니다.