티스토리 뷰
우선 제가 말씀 드리는 내용은 반드시 실습을 해 보셔야 합니다.
그렇게 했을 때, 내것이 될 수 있습니다. 그냥 눈으로만 보고 지나간다면 1시간 뒤면 내 기억속에서 사라집니다.
그리고 실습은 가능한 Jupyter notebook으로 하시기 바랍니다.
jupyter notebook은 pip 나 anaconda, miniconda 설치로 가능합니다.
OpenCV는 이벤트 처리가 쉽고, 그림을 그리는 것이 매우 쉽다.
우선 OpenCV가 가지고 있는 모든 이벤트를 보기위해서 다음과 같이 하면 OpenCV가 지정한 모든 것을 볼 수 있습니다. 그런데 이렇게 하면 너무 많아서 찾기 어려우니...
1 2 3 4 | import cv2 for name in dir(cv2): print(name) | cs |
다음과 같이 하시는 것이 휠씬 보기 쉽습니다.
1 2 3 4 5 | import cv2 for name in dir(cv2): if 'EVENT_' in name: print(name) | cs |
Event 종류
EVENT_FLAG_ALTKEY EVENT_FLAG_CTRLKEY EVENT_FLAG_LBUTTON EVENT_FLAG_MBUTTON EVENT_FLAG_RBUTTON EVENT_FLAG_SHIFTKEY EVENT_LBUTTONDBLCLK EVENT_LBUTTONDOWN # 자주 활용됨 EVENT_LBUTTONUP # 자주 활용됨 EVENT_MBUTTONDBLCLK EVENT_MBUTTONDOWN EVENT_MBUTTONUP EVENT_MOUSEHWHEEL EVENT_MOUSEMOVE # 자주 활용됨 EVENT_MOUSEWHEEL EVENT_RBUTTONDBLCLK EVENT_RBUTTONDOWN EVENT_RBUTTONUP
마우스 이벤트를 Callback 함수와 연결시는 방법은
cv2.setMouseCallback(windowName, draw)
사용자의 KeyBoard 입력은 key = cv2.waitKey(1) 로 인식을 합니다.
그림 그리기는 다음과 같은 함수를 이용하면 됩니다.
cv2.rectangle(img, (x, y), (x+width, y+height), green, -1) # 사각형 그리기
cv2.circle(img, (x, y), radius, red, -1) # 원 그리기
cv2.line(canvas, (0, 0), (300, 300), green) # 선그리기
아래 소스는 Mode(원, 사각형)를 변경하면서 마우스 클릭후 이동하고, 마우스를 땔때 사각형과 원을 그리는 소스입니다.
실제 소스를 실행하면서 많은 것을 배울 수 있으니 가능하면 Keyboard로 한자 한자 입력해 보시기 바랍니다.
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import numpy as np import cv2 from math import sqrt, pow windowName = 'Drawing' img = np.zeros((512, 512, 3), np.uint8) cv2.namedWindow(windowName) green = (0, 255, 0) red = (0, 0, 255) drawing = False mode = True (ix, iy) = (-1, -1) def draw(event, x, y, flags, param): global ix, iy, drawing, mode # 왼쪽 마우스 버턴이 눌러졌을 때 if event == cv2.EVENT_LBUTTONDOWN: drawing = True (ix, iy) = x, y # 마우스가 욺직일때 elif event == cv2.EVENT_MOUSEMOVE: if drawing == True: if mode == True: cv2.rectangle(img, (ix, iy), (x, y), green, -1) else: radius = int(sqrt(pow(x-ix,2)+pow(y-iy,2))/2) cv2.circle(img, (ix, iy), radius, red, -1) # 왼쪽 마우스를 뗄때.... elif event == cv2.EVENT_LBUTTONUP: drawing = False if mode == True: # 사각형 그리기... cv2.rectangle(img, (ix, iy), (x, y), green, -1) else: # 원 그리기.... 처음 클릭 좌표와 이동후의 거리를 재서 radius = int(sqrt(pow(x-ix,2)+pow(y-iy,2))/2) cv2.circle(img, (ix, iy), radius, red, -1) cv2.setMouseCallback(windowName, draw) def main(): global mode while(True): cv2.imshow(windowName, img) key = cv2.waitKey(1) if key == ord('m') or key == ord('M'): mode = not mode elif key == 27: break cv2.destroyAllWindows() # if __name__ == '__main__': main() | cs |
'OpenCV' 카테고리의 다른 글
OpenCV 기초 - Image Processing(Resize, Flipping) (0) | 2018.04.02 |
---|---|
OpenCV 기초 - Image Processing(Transition, Rotation) (0) | 2018.04.01 |
OpenCV 기초 - 이미지 파일 오픈/변경/저장 (0) | 2018.04.01 |
OpenCV 기초 - 왜 RBG가 아니라 BGR로 저장할까? (0) | 2018.04.01 |