
๐
์๋ ํ์ธ์~ ์ค๋๋ง์ 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์์)์ผ๋ก ์ด๊ธฐํํ์ฌ ์บ๋ฒ์ค๋ฅผ ์ด๊ธฐ ์ํ๋ก ๋๋๋ฆด ์ ์์ต๋๋ค.
์ด๋ฒ ๊ฐ์ข๋ ์ฌ๊ธฐ๊น์ง์ ๋๋ค. ํน์ ์ดํด๊ฐ ์ ๋์๋ฉด ๋ง์๊ป ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์ ์ ๊ฐ ์๋ ํ ์ฑ์คํ ๋ต๊ธ์ ๋ฌ๊ฒ ์ต๋๋ค.
๐ค๐ค๐ค
'OpenCV > OpenCV ๊ฐ์ข' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
OpenCV ๊ฐ์ข 6 - ํค๋ณด๋ ์ด๋ฒคํธ (0) | 2020.10.07 |
---|---|
OpenCV ๊ฐ์ข 5 - ๋ฌธ์๋ฅผ ์ถ๋ ฅํ์~ (0) | 2020.10.04 |
OpenCV ๊ฐ์ข 4 - ๋ํ์ ๊ทธ๋ฆฌ์. (0) | 2020.10.03 |
OpenCV2 ๊ฐ์ข 3 - ๋น๋์ค ํ๋ ์ ์บก์ฒ ๋ฐ ํ์ (0) | 2020.09.11 |
OpenCV ๊ฐ์ข 2 - ์์ ์ ์ถ๋ ฅ๊ณผ Display (0) | 2020.09.10 |