opencv - 7일차
어제에 이어서 Mouse Click Event 에 관한 예시를 더 살펴봤다.
import numpy as np
import cv2
def click_event(img, x,y, flags, params):
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(img, (x,y), 3, (0,0,255), -1)
cv2.imshow('image', img)
img = np.zeros((512,512,3), np.uint8)
cv2.imshow('image', img)
points = []
cv2.setMouseCallback('image', click_event)
cv2.waitKey(0)
ev2.destroyAllWindows()
원을 그리는 함수 cv.circle 을 이용한다
파라미터로는
첫번째: 배경 이미지
두번째: x y 좌표 which will be 원의 중심
세번째: 원의 반지름
네번째: BGR 색상
다섯번째: thickness 인데 -1이면 원이 다 색으로 채워진다는 것
하트를 그려봤다
이를 조금 더 응용해서 점을 찍는 두 좌표를 연결하는 코드를 작성해보면,
import numpy as np
import cv2
def click_event(event, x, y ,flags, params):
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(img, (x,y), 3, (0,0,255), -1)
points.append((x,y))
if len(points) >= 2:
cv2.line(img, points[-1], points[-2], (255,0,0), 5)
cv2.imshow('image', img)
img = np.zeros((512,512,3), np.uint8)
cv2.imshow('image', img)
points = []
cv2.setMouseCallback('image', click_event)
cv2.waitKey(0)
ev2.destroyAllWindows()
points 라는 리스트를 만들어서 마우스 클릭할 때마다 배열형태로 그 좌표를 저장하고,
그 길이가 2 이상이면 두 점 사이에 line을 만든다
cv.line 메소드는 우리가 앞에서 배웠던 함수고 파라미터는
그리고자 하는 이미지, 좌표1, 좌표2, 색상, 두께 이다.
이번에는 바탕이 검정색이 아닌, 칼라 사진을 가지고 와서 마우스 클릭할 때마다 그 좌표의 BGR 채널 색상을 리턴하는 함수를 만들자
import numpy as np
import cv2
def click_event(event, x, y ,flags, params):
if event == cv2.EVENT_LBUTTONDOWN:
blue = img[x,y,0]
green = img[x,y,1]
red = img[x,y,2]
cv2.circle(img, (x,y), 3, (0,0,255), -1)
mycolorImage = np.zeros((512,512,3), np.uint8)
mycolorImage[:] = [blue, green, red]
cv2.imshow('color', mycolorImage)
img = cv2.imread('lena.jpg')
cv2.imshow('image', img)
cv2.setMouseCallback('image', click_event)
cv2.waitKey(0)
ev2.destroyAllWindows()
마찬가지로 BGR 채널의 값을 알아내고, color 이라는 창에 클릭한 좌표의 특정한 BGR 값이 출력되는 함수이다.
출처) opencv python tutorial for beginners 9 - mouse handling event