๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[v0.7]์์์ฒ๋ฆฌ_OpenCV_์ฐฝ ๊ด๋ฆฌ ๋ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ณธ๋ฌธ
[v0.7]์์์ฒ๋ฆฌ_OpenCV_์ฐฝ ๊ด๋ฆฌ ๋ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ
์ง์ง์ํ์นด 2021. 12. 30. 00:55211230 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ๊ทํ์ด ์์ฌ๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
OpenCV - 5. ์ฐฝ ๊ด๋ฆฌ ๋ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ
์ด๋ฒ ํฌ์คํ ์์๋ ์ฐฝ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ ํค๋ณด๋ ๋ฐ ๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ ๊ธ ์ญ์ ํ์ด์ฌ์ผ๋ก ๋ง๋๋ OpenCV ํ๋ก์ ํธ(์ด์ธ์ฐ ์ )๋ฅผ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค. ์ฝ๋: ht
bkshin.tistory.com
1. ์ฐฝ ๊ด๋ฆฌ
cv2.namedWindow(winname, flags)
winname: ์ฐฝ ๊ตฌ๋ถ์๋ก ํ์ฉ๋ ์ฐฝ ์ด๋ฆ
flags: ์ฐฝ ์ต์
(cv2.WINDOW_NORMAL: ์ฌ์ฉ์๊ฐ ์ฐฝ ํฌ๊ธฐ๋ฅผ ์กฐ์ O
cv2.WINDOW_AUTOSIZE: ์ด๋ฏธ์ง์ ๋์ผํ ํฌ๊ธฐ๋ก ์ฐฝ ํฌ๊ธฐ๋ฅผ ์ฌ์กฐ์ X)
cv2.moveWindow(winname, x, y)
: ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ํ๋ ์์น๋ก ์ฐฝ์ ์ฎ๊ธธ ์ ์์
winname: ์์น๋ฅผ ๋ณ๊ฒฝํ ์ฐฝ ์ด๋ฆ
x, y: ๋ณ๊ฒฝํ ์์น (x, y ์ขํ)
cv2.resizeWindow(winname, width, hegith)
: winname ์ฐฝ์ ํฌ๊ธฐ๋ฅผ (width, height) ํฌ๊ธฐ๋ก ๋ณ๊ฒฝ
cv2.destroyWindow(winname)
: winname์ ํด๋นํ๋ ์ฐฝ์ ๋ซ๊ธฐ
cv2.destroyAllwindows()
: ์ด๋ฆฐ ๋ชจ๋ ์ฐฝ์ ๋ซ๊ธฐ
# ์ฐฝ ๊ด๋ฆฌ
import cv2
file_path = 'img/sample.jpeg'
img = cv2.imread(file_path) # ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ฝ๊ธฐ
img_gray = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE) # ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ ์ด ์ค์ผ์ผ๋ก ์ฝ๊ธฐ
cv2.namedWindow('origin') # origin ์ด๋ฆ์ผ๋ก ์ฐฝ ์์ฑ
cv2.namedWindow('gray', cv2.WINDOW_NORMAL) # gray ์ด๋ฆ์ผ๋ก ์ฐฝ ์์ฑ
cv2.imshow('origin', img) # origin ์ฐฝ์ ์ด๋ฏธ์ง ํ์
cv2.imshow('gray', img_gray) # gray ์ฐฝ์ ์ด๋ฏธ์ง ํ์
cv2.moveWindow('origin', 0, 0) # ์ฐฝ ์์น ๋ณ๊ฒฝ
cv2.moveWindow('gray', 100, 100) # ์ฐฝ ์์น ๋ณ๊ฒฝ
cv2.waitKey(0) # ์๋ฌดํค๋ ๋๋ฅด๋ฉด
cv2.resizeWindow('origin', 200, 200) # ์ฐฝ ํฌ๊ธฐ ๋ณ๊ฒฝ (๋ณ๊ฒฝ ์๋จ)
cv2.resizeWindow('gray', 100, 100) # ์ฐฝ ํฌ๊ธฐ ๋ณ๊ฒฝ (๋ณ๊ฒฝ ๋จ))
cv2.waitKey(0) # ์๋ฌดํค๋ ๋๋ฅด๋ฉด
cv2.destroyWindow("gray") # gray ์ฐฝ ๋ซ๊ธฐ
cv2.waitKey(0) # ์๋ฌดํค๋ ๋๋ฅด๋ฉด
cv2.destroyAllWindows() # ๋ชจ๋ ์ฐฝ ๋ซ๊ธฐ
2. ํค๋ณด๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ
cv2.waitKey(delay)
: delay ๋ฐ๋ฆฌ์ด๋งํผ ํ๋ก๊ทธ๋จ์ ๋ฉ์ถ๊ณ ์๋ค๊ฐ ํค๋ณด๋์ ๋๋ฆฐ ํค์ ๋์ํ๋ ๊ฐ์ ๋ฐํ
# ํค ์ด๋ฒคํธ ์ฒ๋ฆฌ
import cv2
img_file = "img/sample.jpeg"
img = cv2.imread(img_file)
title = 'keyboard event processing' # ์ฐฝ ์ด๋ฆ
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)) # ํค๋ณด๋ ์
๋ ฅ ๊ฐ, ๋ฌธ์ ๊ฐ ์ถ๋ ฅ
if key == ord('a'): # 'h' ํค ์ด๋ฉด ์ข๋ก ์ด๋
x -= 10
elif key == ord('s'): # 'j' ํค ์ด๋ฉด ์๋๋ก ์ด๋
y += 10
elif key == ord('w'): # 'k' ํค ์ด๋ฉด ์๋ก ์ด๋
y -= 10
elif key == ord('d'): # 'l' ํค ์ด๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
x += 10
elif key == ord('q') or key == 27: # 'q' ์ด๊ฑฐ๋ 'esc' ์ด๋ฉด ์ข
๋ฃ
break
cv2.destroyAllWindows()
cv2.moveWindow(title, x, y ) # ์๋ก์ด ์ขํ๋ก ์ฐฝ ์ด๋
3. ๋ง์ฐ์ค ์ด๋ฒคํธ ์ฒ๋ฆฌ
cv2.setMouseCallback(windowName, onMouse, param=None)
windowName : ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ ์๋์ฐ ์ด๋ฆ
onMouse(evnet, x, y, flags, param) : ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ฏธ๋ฆฌ ์ ์ธํด ๋์ ๋ง์ฐ์ค ์ฝ๋ฐฑ ํจ์
: ๋ง์ฐ์ค์ ์ด๋ฒคํธ์ ๋ง์ฐ์ค ์ขํ๋ฅผ ์ฒ๋ฆฌ
# ๋ง์ฐ์ค ์ด๋ฒคํธ๋ก ์ ๊ทธ๋ฆฌ๊ธฐ
import cv2
title = 'mouse event' # ์ฐฝ ์ ๋ชฉ
img = cv2.imread('img/sample.jpeg') # ๋ฐฑ์ ์ด๋ฏธ์ง ์ฝ๊ธฐ
cv2.imshow(title, img) # ๋ฐฑ์ ์ด๋ฏธ์ง ํ์
cv2.moveWindow(title, 100, 100) # ์ต์ด ์ขํ
def onMouse(event, x, y, flags, param): # ์๋ฌด์ค ์ฝ๋ฐฑ ํจ์ ๊ตฌํ ---โ
print(event, x, y, ) # ํ๋ผ๋ฏธํฐ ์ถ๋ ฅ
if event == cv2.EVENT_LBUTTONDOWN: # ์ผ์ชฝ ๋ฒํผ ๋๋ฆ์ธ ๊ฒฝ์ฐ ---โก
cv2.circle(img, (x,y), 30, (34,12,255), -1) # ์ง๋ฆ 30 ํฌ๊ธฐ์ RGB์ ์์ ํด๋น ์ขํ์ ๊ทธ๋ฆผ
cv2.imshow(title, img) # ๊ทธ๋ ค์ง ์ด๋ฏธ์ง๋ฅผ ๋ค์ ํ์ ---โข
cv2.setMouseCallback(title, onMouse) # ๋ง์ฐ์ค ์ฝ๋ฐฑ ํจ์๋ฅผ GUI ์๋์ฐ์ ๋ฑ๋ก ---โฃ
while True:
if cv2.waitKey(0) & 0xFF == 27: # esc๋ก ์ข
๋ฃ
break
cv2.destroyAllWindows()
+) flags๋ฅผ ํ์ฉ
cv2.EVENT_FLAG_CTRLKEY(8) : Ctrl ํค๋ฅผ ๋๋ฆ
cv2.EVENT_FLAG_SHIFTKEY(16) : Shift ํค๋ฅผ ๋๋ฆ
cv2.EVENT_FLAG_ALTKEY(32) : Alt ํค๋ฅผ ๋๋ฆ
์ปจํธ๋กค + ์ฌํํธ + ๋ง์ฐ์ค ํด๋ฆญ => ์ด๋ก์ ์
์ปจํธ๋กค + ๋ง์ฐ์ค ํด๋ฆญ => ๋นจ๊ฐ์ ์
์ฌํํธ + ๋ง์ฐ์ค ํด๋ฆญ => ํ๋์ ์
# flags๋ฅผ ํ์ฉํ์ฌ ์ ๊ทธ๋ฆฌ๊ธฐ
import cv2
title = 'mouse event' # ์ฐฝ ์ ๋ชฉ
img = cv2.imread('img/sample.jpeg') # ๋ฐฑ์ ์ด๋ฏธ์ง ์ฝ๊ธฐ
cv2.imshow(title, img) # ๋ฐฑ์ ์ด๋ฏธ์ง ํ์
cv2.moveWindow(title, 100, 100) # ์ต์ด ์ขํ
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']
# ์ง๋ฆ 30 ํฌ๊ธฐ์ ๊ฒ์์ ์์ ํด๋น ์ขํ์ ๊ทธ๋ฆผ
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()
ํ,,์ฌ๋ฐ๋ฝ