LiJell's 성장기

06. OpenCV 키보드 마우스 이벤트 처리 (6편) 본문

Bigdata/OpenCV

06. OpenCV 키보드 마우스 이벤트 처리 (6편)

All_is_LiJell 2022. 1. 27. 17:40
반응형

 

cat.bmp
0.88MB
imgbin_sunglasses_1.png
0.02MB

2022.01.27 - [Bigdata/OpenCV] - 07. OpenCV Point Processing (7편)

2022.01.26 - [Bigdata/OpenCV] - 05. OpenCV Basic 두번째 (5편)

 

 

05. OpenCV Basic 두번째 (5편)

2022.01.25 - [Bigdata/OpenCV] - 03. OpenCV_Basic (3편) 2022.01.24 - [Bigdata/OpenCV] - 01. OpenCV_Intro (1편) 01. OpenCV_Intro (1편) 2022.01.25 - [Bigdata/OpenCV] - 03. OpenCV_Basic (3편) 2022.01.25..

lime-jelly.tistory.com

 

07. OpenCV Point Processing

7. OpenCV Point Processing 7.1. histogram sliding import numpy as np import sys import cv2 7.1.1. 흑백 GrayScale src = cv2.imread('./fig/lenna.bmp', cv2.IMREAD_GRAYSCALE) if src is None: print('imag..

lime-jelly.tistory.com

6. OpenCV keyboard mouse event

import numpy as np
import sys
import cv2

6.1. 키보드 event

img = cv2.imread('./Ch_2_Opencv_basic/fig/cat.bmp')

if img is None:
    print('image read failed')
    sys.exit()

cv2.imshow('image', img)
img1 = img.copy()
while True:
    key = cv2.waitKey()
    if key == 27:
        break

    elif key == ord('e'):
        img = cv2.Canny(img, 50, 150) # edge
        cv2.imshow('image', img)

    elif key == ord('i'):
        img = 255 - img
        cv2.imshow('image', img) # inverse

    elif key == ord('r'):
        img = img1.copy()
        cv2.imshow('image', img) # 원래 사진으로 돌아가기

cv2.destroyAllWindows()

6.2. 마우스 event

6.2.1. 단순 event

def call_mouse(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN: # 왼쪽 버튼이 내려갈 때
        print('left btn down = ', x, y)
    elif event == cv2.EVENT_LBUTTONUP: # 오른쪽 버튼이 올라갈 때
        print('left btn up = ',x, y)
    elif event == cv2.EVENT_MOUSEMOVE: # 움직일 때
        if flags == cv2.EVENT_FLAG_LBUTTON: # 왼쪽 버튼을 누르고 있을 때 (FLAG)
            # 두개가 합쳐져서 왼쪽 버튼을 누르고 움직일 때 동작함. 
            print(x, y)

img = np.ones((480, 640, 3), np.uint8)*255



cv2.namedWindow('image')
# cv2.setMouseCallback(windowName, onMouse, param = None) -> None
    # windowName: 마우스이벤트를 수행할 창 이름
    # onMouse: 마우스 이벤트 콜벡함수
    # param: 콜백함수에 전달할 데이터

cv2.setMouseCallback('image', call_mouse, img)

cv2.imshow('image',img)

cv2.waitKey()
cv2.destroyAllWindows()

6.2.2. 그림 또는 이름을 쓸 수 있게 만들기

oldx = oldy = 0 # 시작점을 제공

def call_mouse(event, x, y, flags, param):
    global oldx, oldy

    if event == cv2.EVENT_LBUTTONDOWN:
        oldx, oldy = x, y

    elif event == cv2.EVENT_MOUSEMOVE:
        if flags == cv2.EVENT_FLAG_LBUTTON:
            cv2.line(img, (oldx, oldy), (x, y), (0,0,255), 5, cv2.LINE_AA)
            cv2.imshow('image', img)
            oldx, oldy = x, y # 키가 다시 oldx, oldy로 돌아가서 다시 그려줌

# 결적으로 부드럽고 연결된 선을 그릴 수 있다. 



img = np.ones((480, 640, 3), np.uint8)*255
cv2.namedWindow('image')
# cv2.setMouseCallback(windowName, onMouse, param = None) -> None
    # windowName: 마우스이벤트를 수행할 창 이름
    # onMouse: 마우스 이벤트 콜벡함수
    # param: 콜백함수에 전달할 데이터

cv2.setMouseCallback('image', call_mouse, img)

cv2.imshow('image',img)

cv2.waitKey()
cv2.destroyAllWindows()

6.2.3. 싸인해서 저장하기

start = 0

def call_mouse(event, x, y, flags, param):
    global start

    if event == cv2.EVENT_LBUTTONDOWN:
        start = x, y

    elif event == cv2.EVENT_MOUSEMOVE:
        if flags == cv2.EVENT_FLAG_LBUTTON:
            cv2.line(img, (start), (x, y), (0,0,255), 5, cv2.LINE_AA)
            cv2.imshow('image', img)
            start = x, y

img = np.ones((480, 640, 3), np.uint8)*255



cv2.namedWindow('image')
# cv2.setMouseCallback(windowName, onMouse, param = None) -> None
    # windowName: 마우스이벤트를 수행할 창 이름
    # onMouse: 마우스 이벤트 콜벡함수
    # param: 콜백함수에 전달할 데이터

cv2.setMouseCallback('image', call_mouse, img)

cv2.imshow('image',img)

while True:
    key = cv2.waitKey()
    if key == 27:
        break
    elif key == ord('s'):
        cv2.imwrite('./signiture.png', img)
cv2.destroyAllWindows()

6.3. trackbar

6.3.1. Normal case

  • 화면을 읽어 낸 후 조절을 가능하게 한다
def call_trackbar(pos):
    img[:] = pos
    cv2.imshow('image', img)




img = np.zeros((480,640), np.uint8)

cv2.namedWindow('image')

# createTrackbar(trackbarName, windowName, value, count, onChange) -> None
# trackbarName: 트랙바 이름
# windowName : 트랙바를 생성할 창 이름
# value : 트랙바 위치 초기값
# count : 트랙바 최댓값, 최솟값은 0
# onChange :callback 함수 e.g., onChange(pos) 위치를 정수형태로 전달

cv2.createTrackbar('level', 'image', 50, 255, call_trackbar) # 밝기 조절
cv2.imshow('image', img)


while True:
    key = cv2.waitKey()
    if key == 27:
        break

cv2.destroyAllWindows()

6.3.2 alpha channel로 하기

def call_trackbar(pos):
    global mask

    img_glass = mask*pos # 값이 0 또는 1이기 때문에 곱해줄 수 있다
    cv2.imshow('image', img_glass)

img_alpha = cv2.imread('./Ch_2_Opencv_basic/fig/imgbin_sunglasses_1.png', cv2.IMREAD_UNCHANGED)


mask = img_alpha[:,:,-1]

mask[mask > 0] = 1 # 혹시 모르니 0보다 큰 값을 모두 1로 변환
cv2.namedWindow('image')

# createTrackbar(trackbarName, windowName, value, count, onChange) -> None
# trackbarName: 트랙바 이름
# windowName : 트랙바를 생성할 창 이름
# value : 트랙바 위치 초기값
# count : 트랙바 최댓값, 최솟값은 0
# onChange :callback 함수 e.g., onChange(pos) 위치를 정수형태로 전달

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', mask)
cv2.createTrackbar('level','image', 0, 255, call_trackbar)

while True:
    key = cv2.waitKey()
    if key == 27:
        break

cv2.destroyAllWindows()

반응형

'Bigdata > OpenCV' 카테고리의 다른 글

08. OpenCV Histogram Modification (8편)  (0) 2022.01.28
07. OpenCV Point Processing (7편)  (0) 2022.01.27
05. OpenCV Basic 두번째 (5편)  (0) 2022.01.26
04. OpenCV Basic Review + α (4편)  (0) 2022.01.26
03. OpenCV_Basic (3편)  (0) 2022.01.25
Comments