Python

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

teamnova 2023. 8. 15. 12:00
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()

 

 

결과는 다음과 같습니다.