티스토리 뷰

우선 제가 말씀 드리는 내용은 반드시 실습을 해 보셔야 합니다.

그렇게 했을 때, 내것이 될 수 있습니다. 그냥 눈으로만 보고 지나간다면 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((5125123), np.uint8)
cv2.namedWindow(windowName)
green = (02550)
red = (00255)
 
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


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함