개발새발 로그

OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭-2 본문

파이썬

OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭-2

이즈흐 2021. 11. 8. 00:26

안녕하세요~

OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭

두 번째 포스팅입니다!

 

이번 포스팅은 코드를 한 줄 한 줄 확인해보고 해석할 겁니다!

인터넷에는 상당히 많은 OPENCV와 같은 라이브러리를 사용하고 간단한 프로그램에 사용한 코드들이 많습니다

하지만 그런 코드들을 한 줄 한줄 보면서 어떤 용도인지 알아야 하는데

사실.. 많이 어렵습니다. 

저도 많이 그래 왔습니다. 그냥 코드 되는 것들 골라서 복사만 했지 그 용도를 인지하지는 못했습니다. 

너무 어려운 건 맞습니다.

그래도 한 줄 한줄 읽어보면서 용도를 알아보고 막히는 부분이 있다면 내 방식대로 일단 이해해보는 게 좋습니다!

코딩은 어찌 됐건 자기만의 방식이 생기는 법이니까요

 


먼저 OPENCV를 이용해서 RGB 값을 출력하는 프로그램을 해보겠습니다.

 

저희는 먼저 OPENCV를 이용해서 이미지를 띄우고

그 이미지의 RGB 값을 갖고오는것을 첫번째로 해야겠죠?

 

 

이미지를 마우스로 클릭해 해당 RGB값 출력하기

 

import cv2
import numpy as np
import colorsys


def mouseRGB(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN: 
        colorsB = image[y,x,0]
        colorsG = image[y,x,1]
        colorsR = image[y,x,2]
        colors = image[y,x]
        print("Red: ",colorsR)
        print("Green: ",colorsG)
        print("Blue: ",colorsB)
        print("BRG Format: ",colors)
        print("Coordinates of pixel: X: ",x,"Y: ",y)
        print(colorsys.rgb_to_hsv(colorsR, colorsG, colorsB))
     
image = cv2.imread("img/up2.PNG")
cv2.namedWindow('mouseRGB')
cv2.setMouseCallback('mouseRGB',mouseRGB)


while(1):
    cv2.imshow('mouseRGB',image)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

이 코드는 이미지를 띄워 이미지를 클릭했을 때 해당 부분의 픽셀 RGB값을 추출하는 코드입니다.

 

아주  간단하죠?

 

이 코드를 한번 한 줄씩 살펴볼게요!

 

image = cv2.imread("img/up2.PNG")
cv2.namedWindow('mouseRGB')
cv2.setMouseCallback('mouseRGB',mouseRGB) #

cv2.imread() 이미지를 읽어옵니다.

cv2.nameWindow() 지정된 이름의 window(창)을 생성한다
cv2.setMouseCallback(창 이름 , 콜백 함수, 사용자 정의 데이터)을 의미합니다.

해당되는 창 이름에 이벤트를 적용하는 명령어입니다!

콜백 함수는 마우스 이벤트가 발생했을 때, 전달할 함수를 의미합니다.

사용자 정의 데이터는 마우스 이벤트로 전달할 때, 함께 전달할 사용자 정의 데이터를 의미합니다.

 

 

다음 코드를 살펴보겠습니다.

 

while(1):
    cv2.imshow('mouseRGB',image)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

cv2.imshow() 저장된 윈도의 창에 이미지를 띄우는 명령어입니다.

하지만 반복문을 사용하고 있는데요

 

저희가 마우스를 이용해서 클릭하면 RGB 값이 떠야겠죠?

만약 반복을 하지 않으면 한 번 찍으면 이미지가 사라지는데요

그래서 cv2.waitkey()를 써서 계속 반복하되 break문을 만들어주었습니다.

cv2.waitKey( 키 입력 대기 시간 ms)

키 입력을 기다리는 대기 함수입니다. 매개변수로 넘긴 시간 안에 키를 입력하면 소스의 다음줄로 이동합니다. 

약 시간안에 키를 입력하지 않으면 넘어가게 되어 있습니다.

하지만 0을 입력하게 된다면 입력이 될 때까지 기다립니다.

 

if cv2.waitKey(20) & 0xFF == 27:

이 조건문을 자세히 볼까요?

20초의  대기시간 동안 키의 입력을 기다린다 그 키의 값이 27이면 참을 반환한다.

 

  • 0 xFF는?

cv2.waitKey()는 32비트 정수 값을 반환합니다(플랫폼에 따라 다를 수 있음). 키 입력은 8비트 정수 값인 ASCII로 되어 있습니다. 따라서 이 8비트에만 초점을 두고 다른 모든 비트는 0이 되어야 어떤 키가 입력되었는지 알 수 있습니다!

 

cv2. destroyAllWindows() 함수는 열린 모든 창을 닫습니다.

 

 

마지막 이벤트 코드입니다!

 

def mouseRGB(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN: #checks mouse left button down condition
        colorsB = image[y,x,0]
        colorsG = image[y,x,1]
        colorsR = image[y,x,2]
        colors = image[y,x]
        print("Red: ",colorsR)
        print("Green: ",colorsG)
        print("Blue: ",colorsB)
        print("BRG Format: ",colors)
        print("Coordinates of pixel: X: ",x,"Y: ",y)
        print(colorsys.rgb_to_hsv(colorsR, colorsG, colorsB))

image [y, x,0]는 읽어온 이미지의 x와 y의 B값을 읽어옵니다. (y, x, RGB 중 하나) 순서입니다.

image [y, x]는 해당 좌표의 RGB 값을 읽어옵니다

 

여기서 colorsys.rgb_to_hsv가 사용되었습니다. 

이 프로젝트에서 필요한 RGB값을 HSV로 변환하는 명령어입니다.

그렇지만 이 명령어를 사용하게 되면

이런 식으로 마지막 줄에 일정하지 않는 숫자가 나옵니다.

 

아래 링크에 이에 대한 자세한 설명이 있습니다.

 

결과적으로는 저 HSV값을 이용해서 저희가 흔히 알고 있는 HSV값을 바꿔야겠죠??

이 부분도 중요하니까 다음 포스팅에서 공부해보겠습니다!

 

https://docs.python.org/ko/3/library/colorsys.html

 

colorsys — 색 체계 간의 변환 — Python 3.10.0 문서

colorsys — 색 체계 간의 변환 소스 코드: Lib/colorsys.py colorsys 모듈은 컴퓨터 모니터에서 사용되는 RGB (Red Green Blue, 적 녹 청) 색 공간과 세 가지 다른 좌표계 YIQ, HLS (Hue Lightness Saturation, 색상 명도 채

docs.python.org

 

 

 


 

이렇게 아주 간단한 코드를 보았습니다.

 

정말 간단하지만 기초가 단단하지 않다면 봐도 무슨 소리인지 모를 명령어들이 많이 있습니다.

그만큼 파이썬은 다양한 라이브러리를 사용하고 있고 편리하지만 그만큼 그 명령어의 용도와 이유를 알아야 할 것 같습니다!

728x90
반응형
LIST