π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[v0.8]μμμ²λ¦¬_OpenCV_μ΄λ―Έμ§ λ΄ κ΄μ¬μμ (ROI) λ³Έλ¬Έ
[v0.8]μμμ²λ¦¬_OpenCV_μ΄λ―Έμ§ λ΄ κ΄μ¬μμ (ROI)
μ§μ§μνμΉ΄ 2021. 12. 30. 01:29211230 μμ±
<λ³Έ λΈλ‘κ·Έλ κ·νμ΄ μμ¬λμ λΈλ‘κ·Έλ₯Ό μ°Έκ³ ν΄μ 곡λΆνλ©° μμ±νμμ΅λλ€>
https://bkshin.tistory.com/entry/OpenCV-6-dd?category=1148027
OpenCV - 6. μ΄λ―Έμ§ λ΄ κ΄μ¬μμ(Region of Interest, ROI) νμ
μ΄λ² ν¬μ€ν μμλ μ΄λ―Έμ§ λ΄μμ κ΄μ¬ μμ(Region of Interest, ROI)μ νμνλ λ°©λ²μ λν΄ μμλ³΄κ² μ΅λλ€. μ΄λ² ν¬μ€ν μμ 'νμ΄μ¬μΌλ‘ λ§λλ OpenCV νλ‘μ νΈ(μ΄μΈμ° μ )'λ₯Ό μ 리ν κ²μμ λ°
bkshin.tistory.com
1. κ΄μ¬ μμ΅ (ROI, Region Of Interest) νμνκΈ°
: μμ λ΄μμ κ΄μ¬μ΄ μλ μμ
cv2.rectangle(roi, (0,0), (h-1, w-1), (0,255,0))
: νμ λΆλΆλ§ μ¬λΌμ΄μ± ν roi μ΄λ―Έμ§μ (0, 0)λΆν° (h-1, w-1)κΉμ§ (0, 255, 0) μμΌλ‘ μ¬κ°νμ νμ
: (0, 0)μ μ’μΈ‘ μλ¨
: (h-1, w-1)μ μ°μΈ‘ νλ¨
=> roi μ΄λ―Έμ§μ μ’μΈ‘ μλ¨λΆν° μ°μΈ‘ νλ¨κΉμ§λ₯Ό κΌμ§μ μΌλ‘ κ°λ μ¬κ°νμ κ·Έλ €μ€λ€
: RGB κ°μΈ (0, 255, 0)μ λ Ήμ
# κ΄μ¬μμ νμ
import cv2
import numpy as np
img = cv2.imread('img/sun.jpg')
x=320; y=150; w=50; h=50 # roi μ’ν
roi = img[y:y+h, x:x+w] # roi μ§μ ---β
print(roi.shape) # roi shape, (50,50,3)
cv2.rectangle(roi, (0,0), (h-1, w-1), (0,255,0), 10) # roi μ 체μ μ¬κ°ν 그리기 ---β‘
cv2.imshow("img", img)
key = cv2.waitKey(0)
print(key)
cv2.destroyAllWindows()
+) νΉμ μμ νλ λ° λ³΅μ
# κ΄μ¬μμ 볡μ λ° μ μ°½μ λμ°κΈ°
import cv2
import numpy as np
img = cv2.imread('img/sun.jpg')
x=320; y=150; w=50; h=50
roi = img[y:y+h, x:x+w] # roi μ§μ
img2 = roi.copy() # roi λ°°μ΄ λ³΅μ ---β
img[y:y+h, x+w:x+w+w] = roi # μλ‘μ΄ μ’νμ roi μΆκ°, νμ 2κ° λ§λ€κΈ°
cv2.rectangle(img, (x,y), (x+w+w, y+h), (0,255,0), 10) # 2κ°μ νμ μμμ μ¬κ°ν νμ
cv2.imshow("img", img) # μλ³Έ μ΄λ―Έμ§ μΆλ ₯
cv2.imshow("roi", img2) # roi λ§ λ°λ‘ μΆλ ₯
cv2.waitKey(0)
cv2.destroyAllWindows()
2. λ§μ°μ€ λλκ·Έλ‘ κ΄μ¬ μμ νμ
onMouse()λΌλ μ½λ°± ν¨μ
: (1) λ§μ°μ€ μΌμͺ½ λ²νΌμ λλ μ λ, (2) λλ₯Έ μνλ‘ λλκ·Ένμ λ, (3) λ§μ°μ€ μΌμͺ½ λ²νΌμ λ λ
(x0, y0)
: λ§μ°μ€ λλκ·Έκ° μμλ μμΉ
(x, y)
: λ§μ°μ€μ νμ¬ μμΉ
# λ§μ°μ€λ‘ κ΄μ¬μμ μ§μ λ° νμ, μ μ₯
import cv2
import numpy as np
isDragging = False # λ§μ°μ€ λλκ·Έ μν μ μ₯
x0, y0, w, h = -1,-1,-1,-1 # μμ μ ν μ’ν μ μ₯
blue, red = (255,0,0),(0,0,255) # μμ κ°
def onMouse(event,x,y,flags,param): # λ§μ°μ€ μ΄λ²€νΈ νΈλ€ ν¨μ ---β
global isDragging, x0, y0, img # μ μλ³μ μ°Έμ‘°
if event == cv2.EVENT_LBUTTONDOWN: # μΌμͺ½ λ§μ°μ€ λ²νΌ λ€μ΄, λλκ·Έ μμ ---β‘
isDragging = True
x0 = x
y0 = y
elif event == cv2.EVENT_MOUSEMOVE: # λ§μ°μ€ μμ§μ ---β’
if isDragging: # λλκ·Έ μ§ν μ€
img_draw = img.copy() # μ¬κ°ν κ·Έλ¦Ό ννμ μν μ΄λ―Έμ§ 볡μ
cv2.rectangle(img_draw, (x0, y0), (x, y), blue, 2) # λλκ·Έ μ§ν μμ νμ
cv2.imshow('img', img_draw) # μ¬κ°ν νμλ κ·Έλ¦Ό νλ©΄ μΆλ ₯
elif event == cv2.EVENT_LBUTTONUP: # μΌμͺ½ λ§μ°μ€ λ²νΌ μ
---β£
if isDragging: # λλκ·Έ μ€μ§
isDragging = False
w = x - x0 # λλκ·Έ μμ ν κ³μ°
h = y - y0 # λλκ·Έ μμ λμ΄ κ³μ°
print("x:%d, y:%d, w:%d, h:%d" % (x0, y0, w, h))
if w > 0 and h > 0: # νκ³Ό λμ΄κ° μμμ΄λ©΄ λλκ·Έ λ°©ν₯μ΄ μ³μ ---β€
img_draw = img.copy() # μ ν μμμ μ¬κ°ν κ·Έλ¦Όμ νμν μ΄λ―Έμ§ 볡μ
# μ ν μμμ λΉ¨κ° μ¬κ°ν νμ
cv2.rectangle(img_draw, (x0, y0), (x, y), red, 2)
cv2.imshow('img', img_draw) # λΉ¨κ° μ¬κ°ν κ·Έλ €μ§ μ΄λ―Έμ§ νλ©΄ μΆλ ₯
roi = img[y0:y0+h, x0:x0+w] # μλ³Έ μ΄λ―Έμ§μμ μ ν μμλ§ ROIλ‘ μ§μ ---β₯
cv2.imshow('cropped', roi) # ROI μ§μ μμμ μμ°½μΌλ‘ νμ
cv2.moveWindow('cropped', 0, 0) # μμ°½μ νλ©΄ μ’μΈ‘ μλ¨μ μ΄λ
cv2.imwrite('img/cropped.jpg', roi) # ROI μμλ§ νμΌλ‘ μ μ₯ ---β¦
print("croped.")
else:
cv2.imshow('img', img) # λλκ·Έ λ°©ν₯μ΄ μλͺ»λ κ²½μ° μ¬κ°ν κ·Έλ¦Όγ
γ
£ μλ μλ³Έ μ΄λ―Έμ§ μΆλ ₯
print("μ’μΈ‘ μλ¨μμ μ°μΈ‘ νλ¨μΌλ‘ μμμ λλκ·Έ νμΈμ.")
img = cv2.imread('img/sun.jpg')
cv2.imshow('img', img)
cv2.setMouseCallback('img', onMouse) # λ§μ°μ€ μ΄λ²€νΈ λ±λ‘ ---β§
cv2.waitKey()
cv2.destroyAllWindows()
+) opencvμ ν¨μ μ¬μ©!
ret = cv2.selectROI(win_name, img, showCrossHair=True, fromCenter=False)
: λ§μ°μ€λ‘ κ΄μ¬ μμμ λλκ·Έ ν λ€ μ€νμ΄μ€λ μν°λ₯Ό λλ₯΄λ©΄ μ μ°½μ κ΄μ¬ μμμ΄ λ¬λ€
win_name : κ΄μ¬μμμ νμν μ°½μ μ΄λ¦
img : κ΄μ¬μμμ νμν μ΄λ―Έμ§
showCrossHair : μ ν μμ μ€μ¬μ μμ λͺ¨μ νμ μ¬λΆ
fromCenter : λ§μ°μ€ μμ μ§μ μ μμμ μ€μ¬μΌλ‘ μ§μ
ret : μ νν μμμ μ’νμ ν¬κΈ° (x, y, w, h); μ νμ μ·¨μνλ©΄ λͺ¨λ 0μΌλ‘ μ§μ λ¨
# selectROIλ‘ κ΄μ¬μμ μ§μ λ° νμ, μ μ₯ (roi_select_img.py)
import cv2, numpy as np
img = cv2.imread('img/sun.jpg')
x,y,w,h = cv2.selectROI('img', img, False) # μλ³Έ μ΄λ―Έμ§ λμ΄μ€
if w and h:
roi = img[y:y+h, x:x+w]
cv2.imshow('cropped', roi) # ROI μ§μ μμμ μμ°½μΌλ‘ νμ
cv2.moveWindow('cropped', 0, 0) # μμ°½μ νλ©΄ μ’μΈ‘ μλ¨μ μ΄λ
cv2.imwrite('img/cropped2.jpg', roi) # ROI μμλ§ νμΌλ‘ μ μ₯
cv2.waitKey(0)
cv2.destroyAllWindows()
Select a ROI and then press SPACE or ENTER button!
Cancel the selection process by pressing c button!
ν.. ROI
μ§μ λ§μ°μ€λ‘ λλκ·Έ ν μ μμλ€λ
κ΅μ₯ν μ μ©νκ΅°
'π©βπ» IoT (Embedded) > Image Processing' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[v0.10]μμμ²λ¦¬_OpenCV_λ°μ΄λ리 μ΄λ―Έμ§λ₯Ό λ§λλ μ€λ μνλ© (0) | 2021.12.30 |
---|---|
[v0.9]μμμ²λ¦¬_OpenCV_μ΄λ―Έμ§ μμννλ°©μ(BGR, HSV, YUV) (0) | 2021.12.30 |
[v0.7]μμμ²λ¦¬_OpenCV_μ°½ κ΄λ¦¬ λ° μ΄λ²€νΈ μ²λ¦¬ (0) | 2021.12.30 |
[v0.6]μμμ²λ¦¬_OpenCV_λν 그리기 (0) | 2021.12.28 |
[v0.5]μμμ²λ¦¬_OpenCV_μ΄λ―Έμ§ λ° λμμ μ½κΈ° (0) | 2021.12.27 |