일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 리액트댓글기능
- JS
- 백준
- 알고리즘
- 프로그래머스
- 다이나믹프로그래밍
- 몽고DB
- 프로그래머스코테
- HTML
- 익스프레스
- dp알고리즘
- 백준구현문제
- 포이마웹
- 자바스크립트
- 백준nodejs
- 리액트
- js코테
- 코테
- 백준알고리즘
- 백준구현
- HTML5
- 코딩테스트
- css기초
- 백준골드
- 백준js
- 프로그래머스JS
- 안드로이드 스튜디오
- JS프로그래머스
- CSS
- 리액트커뮤니티
- Today
- Total
개발새발 로그
OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭-2 본문
안녕하세요~
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
이렇게 아주 간단한 코드를 보았습니다.
정말 간단하지만 기초가 단단하지 않다면 봐도 무슨 소리인지 모를 명령어들이 많이 있습니다.
그만큼 파이썬은 다양한 라이브러리를 사용하고 있고 편리하지만 그만큼 그 명령어의 용도와 이유를 알아야 할 것 같습니다!
'파이썬' 카테고리의 다른 글
OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭-5 (0) | 2021.12.22 |
---|---|
OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭-4 (0) | 2021.12.19 |
파이썬 VS_CODE 처음 설치 후 환경 설정하기(파이썬 오류) (0) | 2021.12.19 |
OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭-3 (0) | 2021.11.08 |
OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭-1 (0) | 2021.11.06 |