π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[v0.13]μμμ²λ¦¬_2μ°¨μ νμ€ν κ·Έλ¨κ³Ό μν¬μ λ³Έλ¬Έ
[v0.13]μμμ²λ¦¬_2μ°¨μ νμ€ν κ·Έλ¨κ³Ό μν¬μ
μ§μ§μνμΉ΄ 2022. 1. 5. 00:55220105 μμ±
<λ³Έ λΈλ‘κ·Έλ κ·νμ΄ μμ¬λμ λΈλ‘κ·Έλ₯Ό μ°Έκ³ ν΄μ 곡λΆνλ©° μμ±νμμ΅λλ€>
OpenCV - 11. 2μ°¨μ νμ€ν κ·Έλ¨κ³Ό μν¬μ(back project)
μ΄λ² ν¬μ€ν μμλ 2μ°¨μ νμ€ν κ·Έλ¨κ³Ό μν¬μμ λν΄ μμλ³΄κ² μ΅λλ€. μ΄λ² ν¬μ€ν μμ 'νμ΄μ¬μΌλ‘ λ§λλ OpenCV νλ‘μ νΈ(μ΄μΈμ° μ )'λ₯Ό μ 리ν κ²μμ λ°νλλ€. μ½λ: github.com/BaekKyunShin/Op
bkshin.tistory.com
1. 2μ°¨μ νμ€ν κ·Έλ¨ (2D Histogram)
: 1μ°¨μ νμ€ν κ·Έλ¨μ μ΄λ―Έμ§ μμ ν½μ μ΄ κ°κ° λͺ κ°μΈμ§λ₯Ό νν
: 2μ°¨μ νμ€ν κ·Έλ¨μ μΆμ΄ 2κ°μ΄κ³ , κ° μΆμ΄ λ§λλ μ§μ μ κ°μλ₯Ό νν
# 2D νμ€ν κ·Έλ¨
import cv2
import matplotlib.pylab as plt
plt.style.use('classic') # --β μ»¬λ¬ μ€νμΌμ 1.x μ€νμΌλ‘ μ¬μ©
img = cv2.imread('img/sunflower.jpg')
plt.subplot(131)
hist = cv2.calcHist([img], [0,1], None, [32,32], [0,256,0,256]) #--β‘
p = plt.imshow(hist) #--β’
plt.title('Blue and Green') #--β£
plt.colorbar(p) #--β€
plt.subplot(132)
hist = cv2.calcHist([img], [1,2], None, [32,32], [0,256,0,256]) #--β₯
p = plt.imshow(hist)
plt.title('Green and Red')
plt.colorbar(p)
plt.subplot(133)
hist = cv2.calcHist([img], [0,2], None, [32,32], [0,256,0,256]) #--β¦
p = plt.imshow(hist)
plt.title('Blue and Red')
plt.colorbar(p)
plt.show()
2. μν¬μ (Back Projection)
: κ΄μ¬ μμμ νμ€ν κ·Έλ¨κ³Ό μ μ¬ν νμ€ν κ·Έλ¨μ κ°λ μμμ μ°Ύμλ΄λ κΈ°λ²
: μν¬μμ νμ©νλ©΄ μ΄λ―Έμ§ λ΄μμ νΉμ 물체λ λ°°κ²½μ λΆλ¦¬
: λΆλ¦¬νκ³ μΆμ κ΄μ¬ μμ(ROI, region of interest)μ μ§μ νκ³ μν¬μμ μ μ©
: κ΄μ¬ μμμ ν°μμΌλ‘, μλ λΆλΆμ κ²μμμΌλ‘ μλ‘ λΆλ¦¬
cv2.calcBackProject(img, channel, hist, ranges, scale)
- img : μ
λ ₯ μ΄λ―Έμ§, [img]μ²λΌ 리μ€νΈλ‘ κ°μΈμ μ¬μ©
- channel : μ²λ¦¬ν μ±λ, 리μ€νΈλ‘ κ°μΈμ μ¬μ©
- hist : μν¬μμ μ¬μ©ν νμ€ν κ·Έλ¨
- ranges : κ° ν½μ
μ΄ κ°μ§ μ μλ κ°μ λ²μ
- scale : κ²°κ³Όμ μ μ©ν λ°°μ¨ κ³μ
masking() ν¨μ
: μ€λ μνλ©κ³Ό λ§μ€νΉμ νμ©νμ¬ κ²°κ³Όλ₯Ό μΆλ ₯
: cv2.getStructuringElement()μ cv2.filter2D()λ λ§μ€ν¬μ νλ©΄μ λΆλλ½κ² ν΄μ£Όλ μν
# λ§μ°μ€λ‘ μ νν μμμ 물체 λΆλ¦¬νκΈ°
import cv2
import numpy as np
import matplotlib.pyplot as plt
win_name = 'back_projection'
img = cv2.imread('img/alpaca1.jpeg')
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
draw = img.copy()
#--β€ μν¬μλ κ²°κ³Όλ₯Ό λ§μ€νΉν΄μ κ²°κ³Όλ₯Ό μΆλ ₯νλ 곡ν΅ν¨μ
def masking(bp, win_name):
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
cv2.filter2D(bp,-1,disc,bp)
_, mask = cv2.threshold(bp, 1, 255, cv2.THRESH_BINARY)
result = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow(win_name, result)
#--β₯ μ§μ ꡬνν μν¬μ ν¨μ
def backProject_manual(hist_roi):
#--β¦ μ 체 μμμ λν H,S νμ€ν κ·Έλ¨ κ³μ°
hist_img = cv2.calcHist([hsv_img], [0,1], None,[180,256], [0,180,0,256])
#--β§ μ νμμκ³Ό μ 체 μμμ λν νμ€ν κ·Έλ¨ κ·Έλ¨ λΉμ¨κ³μ°
hist_rate = hist_roi/ (hist_img + 1)
#--β¨ λΉμ¨μ λ§λ ν½μ
κ° λ§€ν
h,s,v = cv2.split(hsv_img)
bp = hist_rate[h.ravel(), s.ravel()]
# λΉμ¨μ 1μ λμ΄μλ μλκΈ° λλ¬Έμ 1μ λλ μλ 1μ κ°κ² ν¨
bp = np.minimum(bp, 1)
# 1μ°¨μ λ°°μ΄μ μλμ shapeλ‘ λ³ν
bp = bp.reshape(hsv_img.shape[:2])
cv2.normalize(bp,bp, 0, 255, cv2.NORM_MINMAX)
bp = bp.astype(np.uint8)
#--β© μ ν¬μ κ²°κ³Όλ‘ λ§μ€νΉν΄μ κ²°κ³Ό μΆλ ₯
masking(bp,'result_manual')
# OpenCV APIλ‘ κ΅¬νν ν¨μ ---βͺ
def backProject_cv(hist_roi):
# μν¬μ ν¨μ νΈμΆ ---β«
bp = cv2.calcBackProject([hsv_img], [0, 1], hist_roi, [0, 180, 0, 256], 1)
# μ ν¬μ κ²°κ³Όλ‘ λ§μ€νΉν΄μ κ²°κ³Ό μΆλ ₯ ---β¬
masking(bp,'result_cv')
# ROI μ ν ---β
(x,y,w,h) = cv2.selectROI(win_name, img, False)
if w > 0 and h > 0:
roi = draw[y:y+h, x:x+w]
# λΉ¨κ° μ¬κ°νμΌλ‘ ROI μμ νμ
cv2.rectangle(draw, (x, y), (x+w, y+h), (0,0,255), 2)
#--β‘ μ νν ROIλ₯Ό HSV μ»¬λ¬ μ€νμ΄μ€λ‘ λ³κ²½
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
#--β’ H,S μ±λμ λν νμ€ν κ·Έλ¨ κ³μ°
hist_roi = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )
#--β£ ROIμ νμ€ν κ·Έλ¨μ 맀λ΄μΌ ꡬνν¨μμ OpenCV μ΄μ©νλ ν¨μμ κ°κ° μ λ¬
backProject_manual(hist_roi)
backProject_cv(hist_roi)
cv2.imshow(win_name, draw)
cv2.waitKey()
cv2.destroyAllWindows()
- λ§μ°μ€λ‘ κ΄μ¬μμμ μ νν λ€ μν°λ₯Ό λλ₯΄λ©΄ κ΄μ¬ μμμ ν΄λΉνλ λ¬Όμ²΄λ§ μΆμΆ
- κ΄μ¬ μμμ HSV νμμΌλ‘ λ³κ²½
- μ 체 μ΄λ―Έμ§μ νμ€ν κ·Έλ¨μΌλ‘ λλμ΄ λΉμ¨ ꡬνκΈ°
( λΉμ¨ ꡬνκΈ° = κ΄μ¬ μμκ³Ό λΉμ·ν μμ λΆν¬λ₯Ό κ°λ νμ€ν κ·Έλ¨μ 1μ κ°κΉκ², μλλ©΄ 0μ κ°κΉκ² )
- H, S μ±λμ λν 2μ°¨μ νμ€ν κ·Έλ¨ λ§λ€κΈ°
( hist_rateλ νμ€ν κ·Έλ¨ λΉμ¨μ κ°μΌλ‘ κ°μ§ )
( hμ sλ μ€μ μ΄λ―Έμ§μ κ° ν½μ )
( hμ sκ° κ΅μ°¨λλ μ§μ μ λΉμ¨μ κ·Έ ν½μ κ°μΌλ‘ νλ 1μ°¨μ λ°°μ΄ )
- νμ€ν κ·Έλ¨μ μ§μ ꡬνν ν¨μμ OpenCV ν¨μμ νλΌλ―Έν°λ‘ μ λ¬
- μ¬λ¬Όμ λΆλ¦¬ν μ μλ€!
- κ΄μ¬ μμμ μμκ³Ό λΉμ·ν 물체 μΆμΆ
- κ΄μ¬ μμ μΈ λΆλΆμ μμμ΄ λΉμ·ν κ²½μ° ν¨κ³Ό λ¨μ΄μ§
μ μ κΈ°νλΉ
μνλ μμ μΆμΆ νκΈ° ><
'π©βπ» IoT (Embedded) > Image Processing' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[v0.15]μμμ²λ¦¬_μ΄λ―Έμ§ μ΄λ, νλ/μΆμ, νμ (0) | 2022.01.06 |
---|---|
[v0.14]μμμ²λ¦¬_μ΄λ―Έμ§ μ μ¬λ λΉκ΅ μΈ μ€μ΅ (2) | 2022.01.05 |
[v0.12]μμμ²λ¦¬_νμ€ν κ·Έλ¨(Histogram) (0) | 2022.01.05 |
[v0.11]μμμ²λ¦¬_μ΄λ―Έμ§ μ°μ° (ν©μ±, μν λΈλ λ©, λ§μ€νΉ) (0) | 2022.01.02 |
[v0.10]μμμ²λ¦¬_OpenCV_λ°μ΄λ리 μ΄λ―Έμ§λ₯Ό λ§λλ μ€λ μνλ© (0) | 2021.12.30 |