๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[v0.7]์˜์ƒ์ฒ˜๋ฆฌ_OpenCV_์ฐฝ ๊ด€๋ฆฌ ๋ฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/Image Processing

[v0.7]์˜์ƒ์ฒ˜๋ฆฌ_OpenCV_์ฐฝ ๊ด€๋ฆฌ ๋ฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

์ง•์ง•์•ŒํŒŒ์นด 2021. 12. 30. 00:55
728x90
๋ฐ˜์‘ํ˜•

211230 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ๊ท€ํ‰์ด ์„œ์žฌ๋‹˜์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://bkshin.tistory.com/entry/OpenCV-5-%EC%B0%BD-%EA%B4%80%EB%A6%AC-%EB%B0%8F-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%B2%98%EB%A6%AC?category=1148027 

 

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()                                 # ๋ชจ๋“  ์ฐฝ ๋‹ซ๊ธฐ

origin ๊ณผ gray img

 

 

 

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()

ctrl, shift, mouse ๋กœ ์—ฌ๋Ÿฌ ์ƒ‰ ์› ์ฐ๊ธฐ

 

 

ํ›„,,์žฌ๋ฐŒ๋•ฝ

728x90
๋ฐ˜์‘ํ˜•
Comments