OpenCV/OpenCV ๊ฐ•์ขŒ

OpenCV ๊ฐ•์ขŒ 7 - ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๐Ÿ–ฑ๏ธ

KALILIVE 2020. 11. 8. 00:10
๋ฐ˜์‘ํ˜•
์ฅ๊ฐ€ ์•„๋‹Œ ์ด ๋งˆ์šฐ์Šค (์•— ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.)

๐Ÿ– 

์•ˆ๋…•ํ•˜์„ธ์š”~ ์˜ค๋žœ๋งŒ์— OpenCV ๊ฐ•์ขŒ๋ฅผ ํฌ์ŠคํŒ…ํ•˜๋„ค์š”...(๐Ÿ˜ข์š”์ฆ˜ ๋„ˆ๋ฌด ๋ฐ”๋น ์„œ,,)

์ด๋ฒˆ ๊ฐ•์ขŒ๋Š” ์ €๋ฒˆ ๊ฐ•์ขŒ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ์— ์ด์–ด์„œ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ์— ๊ด€ํ•˜์—ฌ ๊ฐ•์ขŒ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

OpenCV๋Š” ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด

cv2.setMouseCallback(window name, callback, param)

๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ™„ ์•ต? ์šฐ๋ฆฌ๊ฐ€ ํ‰์†Œ์— ์‚ฌ์šฉํ•˜๋˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€๊ฐ€ ์•Š๋„ค์š”....

 

๋ณดํ†ต์€ ํ•จ์ˆ˜(์œˆ๋„์šฐ์ด๋ฆ„,ํŠน์„ฑ)์„ ์ž…๋ ฅํ•˜๋Š”๋ฐ onMouse? ๊ฐ€ ๋ญ˜๊นŒ์š”??

์ผ๋‹จ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ถ„์„ํ•ด ๋ด…์‹œ๋‹ค.

 

import cv2
import numpy as np

def onMouse(event,x,y,flags,param):
    if event==cv2.EVENT_LBUTTONDOWN: # ๋งˆ์šฐ์Šค ์™ผ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญ
        if flags & cv2.EVENT_FLAG_SHIFTKEY:
            cv2.rectangle(param[0],(x-5,y-5),(x+5,y+5),(255,0,0))
        else:
            cv2.circle(param[0],(x,y),5,(255,0,0),3)
    elif event==cv2.EVENT_RBUTTONDOWN:
        cv2.circle(param[0],(x,y),5,(0,0,255),3)
    elif event==cv2.EVENT_LBUTTONDBLCLK:
        param[0] = np.zeros(shape=param[0].shape,dtype=np.uint8)+255
    cv2.imshow('img',param[0])

img=np.full(shape=(512,512,3),fill_value=255,dtype=np.uint8)
cv2.imshow('img',img)
cv2.setMouseCallback('img',onMouse,[img])
cv2.waitKey()
cv2.destroyAllWindows()

์ด์ œ๋ถ€ํ„ฐ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์„ค๋ช…์— ๋“ค์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

cv2.setMouseCallback(window name, callback, param)

๊ตฌ์กฐ์—์„œ 

window name ์€ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์œˆ๋„์šฐ ์ฐฝ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ์ธ์ž์ž…๋‹ˆ๋‹ค.

setMouseํ•จ์ˆ˜ ์œ„์˜ img๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์œˆ๋„์šฐ ์ฐฝ์„ ์‹คํ–‰ํ–ˆ์œผ๋ฏ€๋กœ setMouseํ•จ์ˆ˜๋Š” img์ฐฝ์—์„œ

๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

 

callbackํ•จ์ˆ˜์—๋Š” (event, x, y, flags, param)๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” callback ํ•จ์ˆ˜๋ฅผ

onMouse๋ผ๋Š” ํ•จ์ˆ˜๋กœ ์ง€์ •ํ•ด ๊ฐ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ณ„๋กœ ์–ด๋–ค ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ• ์ง€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ธ์ž๋กœ ์‚ฌ์šฉ๋˜๋Š” event๋Š” ์ง€๊ธˆ ์–ด๋–ค ๋งˆ์šฐ์Šค ํด๋ฆญ์ด ์žˆ์—ˆ๋Š”์ง€(์šฐ, ์ขŒ ํด๋ฆญ, ํœ  ๊ฐ™์€...)

x, y๋Š” ์œˆ๋„์šฐ ์ฐฝ ์œ„์— ์žˆ๋Š” ๋งˆ์šฐ์Šค์˜ x, y ์ขŒํ‘œ๊ฐ’

flags๋Š” ์ง€๊ธˆ ๋งˆ์šฐ์Šค์˜ ์ƒํƒœ๊ฐ€ ์–ด๋–ค์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ œ๊ฐ€ ์šฐํด๋ฆญ์„ ํ•˜๊ณ  ๊ทธ ์ƒํƒœ๋กœ ์›€์ง์ด๋ฉด event๊ฐ’์€ 0์œผ๋กœ ์•„๋ฌด๋Ÿฐ ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์˜ ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค๊ณ  ์ถœ๋ ฅ๋˜์ง€๋งŒ

์ €๋Š” ๊ณ„์† ์šฐํด๋ฆญ์„ ํ•˜๊ณ  ์žˆ์Œ์œผ๋กœ flag๋Š” ์šฐํด๋ฆญ ๊ฐ’์ธ 2๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ param๋Š” ํ˜„์žฌ img๊ฐ’์„ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.(ํ–‰๋ น ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.)

 

์ด๋ฒคํŠธ ๊ฐ’

EVENT VALUE
EVENT_FLAG_ALTKEY 32
EYEVENT_FLAG_CTRLKEY 8
EYEVENT_FLAG_LBUTTONKEY 1
EYEVENT_FLAG_MBUTTONKEY 4
EYEVENT_FLAG_RBUTTONKEY 2
EYEVENT_FLAG_SHIFTKEY 16
EVENT_LBUTTONDBLCLK 7
EVENT_LBUTTONDOWN 1
EVENT_LBUTTONUP 4
EVENT_MBUTTONDBLCLK 9
EVENT_MBUTTONDOWN 3
EVENT_MBUTTONUP 6
EVENT_MOUSEHWHEEL 11
EVENT_MOUSEMOVE 0
EVENT_MOUSEWHEEL 10
EVENT_RBUTTONDBLCLK 8
EVENT_RBUTTONDOWN 2
EVENT_RBUTTONUP 5

L/M/RBUTTON ์€ ๊ฐ๊ฐ ์™ผ, ์ค‘์•™, ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

DBCLCK์€ ๋”๋ธ” ํด๋ฆญ, DOWN์€ ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅผ ๋•Œ, UP์€ ์Šค์œ„์น˜๋ฅผ ๋•” ๋•Œ์ž…๋‹ˆ๋‹ค.

MOUSEMOVE์€ ๋งˆ์šฐ์Šค๊ฐ€ ์›€์ง์ผ ๋•Œ์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ณธ์ธ์ด ์›ํ•˜๋Š” ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๊ฐ€ ์–ด๋–ค ๊ฐ’์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด ์•„๊นŒ onMouse์˜ ์ธ์ž๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ’ ์ค‘

event๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ์–ด๋–ค ๊ฐ’์ธ์ง€ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์‹คํ–‰ ํ™”๋ฉด

์˜ˆ์ œ ์‹คํ–‰ํ™”๋ฉด

img์œˆ๋„์šฐ ์œ„์— ๋งˆ์šฐ์Šค๋ฅผ ์šฐ/ ์ขŒ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ shift๋ฅผ ๋ˆ„๋ฅธ ์ฑ„๋กœ ํด๋ฆญํ•˜๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๋„ํ˜•์„

์บ”๋ฒ„์Šค ์œ„์— ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๊ฒฐ๊ณผ

    elif event==cv2.EVENT_LBUTTONDBLCLK:
        param[0] = np.zeros(shape=param[0].shape,dtype=np.uint8)+255

๋˜ํ•œ ์œ„ ์กฐ๊ฑด์‹ ๋Œ€๋กœ ์ขŒ ๋”๋ธ”ํด๋ฆญ์„ ํ•˜๋ฉด param๊ฐ’์„ 255 ๊ฐ’(White์ƒ‰์ƒ)์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ์บ”๋ฒ„์Šค๋ฅผ ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ด๋ฒˆ ๊ฐ•์ขŒ๋Š” ์—ฌ๊ธฐ๊นŒ์ง€์ž…๋‹ˆ๋‹ค. ํ˜น์‹œ ์ดํ•ด๊ฐ€ ์•ˆ ๋˜์‹œ๋ฉด ๋งˆ์Œ๊ป ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š” ์ œ๊ฐ€ ์•„๋Š” ํ•œ ์„ฑ์‹คํžˆ ๋‹ต๊ธ€์„ ๋‹ฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ธ์ œ ์ž๋Ÿฌ๊ฐ€์•ผ์ง€

๐Ÿ’ค๐Ÿ’ค๐Ÿ’ค

๋ฐ˜์‘ํ˜•