티스토리 뷰

  • 1. 키보드 이벤트

키보드 입력 메소드

cv2.waitKey(delay)

 

 

기능

  • delay: 밀리초(0.001s) 단위의 시간동안 대기
    • 0: 대기시간 무한대 
    • -1: 키보드 입력 없으면 반환됨

 

 

키보드 입력을 출력하고 싶으면

key = cv2.waitKey(0)
print(key)

여기서 출력되는 문자는 모두 ASCII 문자이다. 그런말인 즉 한글을 입력하면 오류를 발생 시킬 수 있으니 키를 입력할 때 한글을 입력하지 않는 것이 좋다. 

 

 

 

특정 문자와 비교하고 싶다면

key = cv2.waitKey(0) &0xff
if key == ord('a'):
print("this is a")

여기서 첫번째 행의 코드를보자. 

키보드 입력값과 비트연산을 한게 보이는데 이는 64비트 환경에서 cv2.waitKey() 함수는 32비트 정수를 반환해서 하위 8비트를 제외한 나머지 비트는 0으로 만들어줘야 하기 때문이다. 

 

 

 

키보드 이벤트를 사용한 간단한 예제

import cv2								      


img = cv2.imread('C:/Users/KWON/Pictures/500.png')
title='IMG'         # 창 이름
x,y = 100,100       # 창의 좌표 설정 

while True:
    cv2.imshow(title,img)       
    cv2.moveWindow(title,x,y)
    key=cv2.waitKey(0)&0xff         # 키보드 입력 무한 대기, 하위 8비트 마스크 처리
    print(key,chr(key))             # 입력된 문자를 출력한다. (좌:ASCII 값, 우:문자 값)
    if key == ord('a'):
        x-=10
    elif key ==ord('s'):
        y+=10
    elif key ==ord('w'):
        y-=10
    elif key == ord('d'):
        x+=10
    elif key == ord('q') or key ==27: # esc 키는 ASCII 코드로 27이다. 
        break
        cv2.destroyAllWindows()
    cv2.moveWindow(title,x,y)       # 창을 이동한다. (이동시킬 창, 좌표X,좌표Y)

2. 마우스 이벤트

마우스 이벤트를 처리하려면 이벤트를 처리 할 함수를 미리 선언해 놓은 후 cv2.MouseCallback() 함수에 그 함수를 전달해야 한다. 예를 들자면

def onMouse(event,x,y,flags,param)
cv2.setMouseCallback('title',onMouse)

 

 

기능

cv2.setMouseCallback(win_name,onMouse,[param]):onMouse 함수를 등록

  • win_name: 이벤트를 등록할 윈도 이름
  • onMouse: 이벤트 처리를 위해 미리 선언해 놓은 콜백 함수
  • param: 필요에 따라 onMouse  함수에 전달 할 인자

MouseCallback(event,x,y,flags,param): 콜백함수 선언부

  • event: 마우스 이벤트 종류, cv2.Event_로 시작하는 상수(12 가지)
    • cv2.EVENT_MOUSEMOVE: 마우스 움직임
    • cv2.EVENT_LBUTTONDOWN: 왼쪽 버튼 누름
    • cv2.EVENT_RBUTTONDOWN: 오른쪽 버튼 누름
    • cv2.EVENT_MBUTTONDOWN: 가운데 버튼 누름
    • cv2.EVENT_LBUTTONUP: 왼쪽 버튼 뗌
    • cv2.EVENT_RBUTTONUP: 오른쪽 버튼 뗌
    • cv2.EVENT_MBUTTONUP: 가운데 버튼 뗌
    • cv2.EVENT_LBUTTONDBLCLK: 왼쪽 버튼 더블 클릭
    • cv2.EVENT_RBUTTONDBLCLK: 오른쪽 버튼 더블 클릭
    • cv2.EVENT_MBUTTONDBLCLK: 가운데 버튼 더블 클릭
    • cv2.EVENT_MOUSEWHEEL: 휠 스크롤
    • cv2.EVENT_MOUSEHWHEEL: 휠 스크롤
  • x,y: 마우스 좌표
  • flags: 마우스 동작과 함께 일어난 상태, cv2.EVENT_FLAG_로 시작하는 상수(6가지)
    • cv2.EVENT_FLAG_LBUTTON(1): 왼쪽 버튼 누름
    • cv2.EVENT_FLAG_RBUTTON(2): 오른쪽 버튼 누름
    • cv2.EVENT_FLAG_MBUTTON(4): 가운데 버튼 누름
    • cv2.EVENT_FLAG_CTRLKEY(8): Ctrl 키 누름
    • cv2.EVENT_FLAG_SHIFTKEY(16): Shift 키 누름
    • cv2.EVENT_FLAG_ALTKEY(32): Alt 키 누름
  • param: cv2.setMouseCallback() 함수에서 저달한 인자

 

 

마우스 이벤트를 사용한 간단한 예제

import cv2								      


img = cv2.imread('C:/Users/KWON/Pictures/500.png')
title='mouse event'         # 창 이름
cv2.imshow(title,img)

def onMouse(event,x,y,flags,param):         # 마우스 콜백 함수 구현
    print (event ,x,y)                      # 파라미터들을 출력
    if(event) ==cv2.EVENT_LBUTTONDOWN:      # 만약 마우스 좌클릭을 했으면
        cv2.circle(img,(x,y),30,(0,0,0),-1) # 마우스 좌표에 원을 그린다.
        cv2.imshow(title,img)               # 그려진 이미지를 보여준다.
cv2.setMouseCallback(title,onMouse)         # 마우스 콜백함수를 GUI 윈도우에 등록한다. 

while True: 
    if cv2.waitKey(0) & 0xff ==27:          # esc 로 종료
        break
cv2.destroyAllWindows()

키보드 이벤트와 마우스 이벤트를 활용한 예제 

import cv2

title = 'mouse event'
# 흰색 배경 500 x 500 이미지 불러오기
img = cv2.imread('C:/Users/kycky/opencv/blankFile.jpg')
cv2.imshow(title,img)

colors={                # 색상을 미리 정의했다.
    'black':(0,0,0),
    'red':(0,0,255),
    'blue':(255,0,0),
    'green':(0,255,0)
}

def onMouse(event,x,y,flags,param):             # 마우스 콜백함수 구현
    print(event,x,y,flags)
    color = colors['black']                     # 최초 색상은 검은색으로 설정
    if event == cv2.EVENT_LBUTTONDOWN:          # 이벤트 발동 조건은 마우스 좌클릭
        if flags &cv2.EVENT_FLAG_CTRLKEY and \
            flags&cv2.EVENT_FLAG_SHIFTKEY:      # 만약 쉬프트와 컨트롤을 동시에 누를 경우
            color=colors['green']               # 색상을 초록으로 변경
        elif flags &cv2.EVENT_FLAG_SHIFTKEY:    # 만약 쉬프트를 누를 경우
            color=colors['blue']                # 색상을 파랑으로 변경
        elif flags & cv2.EVENT_FLAG_CTRLKEY:    # 만약 컨트롤을 누를 경우
            color=colors['red']                 # 색상을 빨강으로 변경
        cv2.circle(img,(x,y),30,color,-1)       # 원모양 도형을 그린다.
        cv2.imshow(title,img)                   # 그린 원을 화면에 갱신한다.
cv2.setMouseCallback(title,onMouse)             # 마우스 콜백 함수를 GUI에 등록

while True:
    if cv2.waitKey(0)& 0xff ==27:               # esc 누르면 종료
     break
cv2.destroyAllWindows()

 

키보드 이벤트로 원의 색상을 바꾸게 하고 마우스 좌클릭을 하면 도형이 그려지는 코드이다. 

 

 

코드를 실행한 화면

 

 

3. 트랙바

슬라이드 모양의 인터페이스를 마우스로 움직여서 값을 입력받는 GUI 요소이다. 마우스 이벤트 방식처럼 트랙바를 움직였을 때 동작할 함수를 미리 준비해서 함께 전달하는 구조이다.

 

 

기본 구조

def onChange(value):
    v=cv2.getTrackbarPos('trackbar','win_name')

cv2.createTrackbar('trackbar','win_name',0,100,onChange)

 

기능

cv2.createTrackbar(trackbar_name, win_name, value, count, onChange): 트랙바 생성

  • trackbar_name: 트랙바 이름 
  • win_name: 트랙바를 표시할 창 이름 
  • value: 트랙바 초기 값, 0~count 사이의 값
  • count: 트랙바 눈금의 개수, 트랙바가 표시할 수 있는 최대 값
  • onChange: TrackbarCallback: 트랙바 이벤트 핸들러 함수 

TrackbarCallback(value): 트랙바 이벤트 콜백 함수 

  • value: 트랙바가 움직인 새 위치 값

pos = cv2.getTrackbarPos(trackbar_name,win_name)

  • trackbar_name: 찾고자 하는 트랙바 이름
  • win_name: 트랙바가 있는 창의 이름
  • pos: 트랙바 위치 

 

 

트랙바 이벤트를 활용한 예제 코드

import cv2

win_name = 'track bar'
# 흰색 배경 500 x 500 이미지 불러오기
img = cv2.imread('C:/Users/kycky/opencv/blankFile.jpg')
cv2.imshow(win_name,img)                                # 초기 이미지를 창에 표시

#트랙바 이벤트 처리 함수 선언
def onChange(x):
    print(x)
    # 각 트랙바 위치값
    r= cv2.getTrackbarPos('R',win_name)
    g= cv2.getTrackbarPos('G',win_name)
    b= cv2.getTrackbarPos('B',win_name)
    print(r,g,b)
    img[:] =[b,g,r]                                     # 기존 이미지에 새로운 픽셀 값 적용
    cv2.imshow(win_name,img)                            # 새 이미지 창에 표시

# 트랙바 생성
cv2.createTrackbar('R',win_name,255,255,onChange)
cv2.createTrackbar('G',win_name,255,255,onChange)
cv2.createTrackbar('B',win_name,255,255,onChange)

while True:
    if cv2.waitKey(0)&0xff ==27:
        break
cv2.destroyAllWindows()

 

 

코드를 실행한 이미

 

 

'Opencv 공부' 카테고리의 다른 글

[openCV] Matplotlib  (1) 2023.05.07
[openCV] NumPy  (3) 2023.05.06
[openCV] 창 관리하기  (0) 2023.05.01
[openCV] 그림 그리기  (2) 2023.04.30
[openCV] 이미지,동영상 입출력  (0) 2023.04.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
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
글 보관함