๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[v0.28]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง์ ํน์ง์ , ํน์ง์ ๊ฒ์ถ๊ธฐ ๋ณธ๋ฌธ
[v0.28]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง์ ํน์ง์ , ํน์ง์ ๊ฒ์ถ๊ธฐ
์ง์ง์ํ์นด 2022. 1. 15. 23:23220115 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ๊ทํ์ด ์์ฌ๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
OpenCV - 26. ์ด๋ฏธ์ง์ ํน์ง์ (Keypoints)๊ณผ ํน์ง์ ๊ฒ์ถ๊ธฐ(Keypoints detector)
์ด๋ฒ ํฌ์คํ ์์๋ ์ด๋ฏธ์ง์ ํน์ง์ ๊ณผ ํน์ง์ ๊ฒ์ถ๊ธฐ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์ญ์ 'ํ์ด์ฌ์ผ๋ก ๋ง๋๋ OpenCV ํ๋ก์ ํธ(์ด์ธ์ฐ ์ )'๋ฅผ ์ ๋ฆฌํ ๊ฒ์์ ๋ฐํ๋๋ค. ์ฝ๋: github.com/BaekKyunShi
bkshin.tistory.com
์ด๋ฏธ์ง ๊ฒ์ถํ๊ธฐ ์ํด์๋ ์ด๋ฏธ์ง์ ํน์ง์ ์ฐพ์์ผํจ!
1. ์ด๋ฏธ์ง ํน์ง์
: ์ด๋ฏธ์ง์์ ํน์ง์ด ๋๋ ๋ถ๋ถ
: ์ด๋ฏธ์ง๋ผ๋ฆฌ ์๋ก ๋งค์นญ์ด ๋๋์ง ํ์ธ์ ํ ๋ ๊ฐ ์ด๋ฏธ์ง์์์ ํน์ง์ด ๋๋ ๋ถ๋ถ๋ผ๋ฆฌ ๋น๊ต
: ์ด๋ฏธ์ง ๋งค์นญ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก ํน์ง์
: ํน์ง์ ์ ์์ด๋ก ํค ํฌ์ธํธ(Keypoints)
: ๋ณดํต ํน์ง์ ์ด ๋๋ ๋ถ๋ถ์ ๋ฌผ์ฒด์ ๋ชจ์๋ฆฌ๋ ์ฝ๋
: ๋๋ถ๋ถ์ ํน์ง์ ๊ฒ์ถ์ ์ฝ๋ ๊ฒ์ถ์ ๋ฐํ์ผ๋ก ํจ
2. ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ (Harris Corner Detection)
: ๋ฌผ์ฒด๋ฅผ ์ธ์ํ ๋ ๋ฌผ์ฒด์ ์ฝ๋ ๋ถ๋ถ์ ๊ด์ฌ์ ๋
: ์ด๋ฏธ์ง ์์ ์ฝ๋๋ฅผ ์ ์ฐพ์๋ธ๋ค๋ฉด ๋ฌผ์ฒด๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ์ธ์
: ์ฝ๋๋ฅผ ๊ฒ์ถํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
: ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ์ ์๋ฒจ(Sobel) ๋ฏธ๋ถ์ผ๋ก ๊ฒฝ๊ณ๊ฐ์ ๊ฒ์ถํ๋ฉด์ ๊ฒฝ๊ณ๊ฐ์ ๊ฒฝ์ฌ๋ ๋ณํ๋์ ์ธก์ ํ์ฌ
๋ณํ๋์ด ์์ง, ์ํ, ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ํฌ๊ฒ ๋ณํํ๋ ๊ฒ์ ์ฝ๋๋ก ํ๋จ
dst = cv2.cornerHarris(src, blockSize, ksize, k, dst, borderType)
- src : ์
๋ ฅ ์ด๋ฏธ์ง, ๊ทธ๋ ์ด ์ค์ผ์ผ
- blockSize : ์ด์ ํฝ์
๋ฒ์
- ksize : ์๋ฒจ ๋ฏธ๋ถ ํํฐ ํฌ๊ธฐ
- k(optional) : ์ฝ๋ ๊ฒ์ถ ์์ (๋ณดํ 0.04~0.06)
- dst(optional) : ์ฝ๋ ๊ฒ์ถ ๊ฒฐ๊ณผ (src์ ๊ฐ์ ํฌ๊ธฐ์ 1 ์ฑ๋ ๋ฐฐ์ด, ๋ณํ๋์ ๊ฐ, ์ง์ญ ์ต๋ ๊ฐ์ด ์ฝ๋์ ์ ์๋ฏธ)
- borderType(optional) : ์ธ๊ณฝ ์์ญ ๋ณด์ ํ์
# ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ
import cv2
import numpy as np
img = cv2.imread('img/house.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ ---โ
corner = cv2.cornerHarris(gray, 2, 3, 0.04)
# ๋ณํ๋ ๊ฒฐ๊ณผ์ ์ต๋๊ฐ 10% ์ด์์ ์ขํ ๊ตฌํ๊ธฐ ---โก
coord = np.where(corner > 0.1* corner.max())
coord = np.stack((coord[1], coord[0]), axis=-1)
# ์ฝ๋ ์ขํ์ ๋๊ทธ๋ฆฌ๋ฏธ ๊ทธ๋ฆฌ๊ธฐ ---โข
for x, y in coord:
cv2.circle(img, (x,y), 5, (0,0,255), 1, cv2.LINE_AA)
# ๋ณํ๋์ ์์์ผ๋ก ํํํ๊ธฐ ์ํด์ 0~255๋ก ์ ๊ทํ ---โฃ
corner_norm = cv2.normalize(corner, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
# ํ๋ฉด์ ์ถ๋ ฅ
corner_norm = cv2.cvtColor(corner_norm, cv2.COLOR_GRAY2BGR)
merged = np.hstack((corner_norm, img))
cv2.imshow('Harris Corner', merged)
cv2.waitKey()
cv2.destroyAllWindows()
: ์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง๋ ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ์ ์คํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ์ ์ต๋ ๊ฐ์ 10% ์ด์์ธ ์ขํ์๋ง ๋นจ๊ฐ์ ๋๊ทธ๋ผ๋ฏธ ํ์
: ์ฝ๋์์ ํฝ์ ์ ๋ณํ๋์ด ๊ฐ์ฅ ํฌ๋ค
: cv2.cornerHarris() ํจ์์ ๋ณํ ๊ฒฐ๊ณผ๋ ์ ๋ ฅ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๊ฐ ๊ฐ์ 1์ฐจ์ ๋ฐฐ์ด
: ๊ฒฐ๊ณผ ๊ฐ์ ์ง์ญ ์ต๋ ๊ฐ(Local Maximum)์ ์ฝ๋๋ฅผ ์๋ฏธ
: ์ผ์ชฝ ์ด๋ฏธ์ง๋ ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ ๊ฒฐ๊ณผ๋ฅผ 0~255๋ก ์ ๊ทํํ์ฌ ๋ํ๋ธ ๊ฒ
: ์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง์์ ๋นจ๊ฐ์ ๋๊ทธ๋ผ๋ฏธ๊ฐ ํ์๋์ด ์๋ ์ฝ๋ ๋ถ๋ถ์ด ์ผ์ชฝ ์ด๋ฏธ์ง์์๋ ๊ฐ์ฅ ์ง๊ฒ ํ์๋จ
3. ์-ํ ๋ง์ ๊ฒ์ถ (Shi & Tomasi Detection)
: ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ์ ์ข ๋ ๊ฐ์ ํ ์๊ณ ๋ฆฌ์ฆ
corners = cv2.goodFeaturesToTrack(img, maxCorners, qualityLevel, minDistance, corners, mask, blockSize, useHarrisDetector, k)
- img : ์
๋ ฅ ์ด๋ฏธ์ง
- maxCorners : ์ป๊ณ ์ถ์ ์ฝ๋์ ๊ฐ์, ๊ฐํ ๊ฒ ์์ผ๋ก
- qualityLevel : ์ฝ๋๋ก ํ๋จํ ์ค๋ ์ํ๋ ๊ฐ
- minDistance : ์ฝ๋ ๊ฐ ์ต์ ๊ฑฐ๋ฆฌ
- mask(optional) : ๊ฒ์ถ์ ์ ์ธํ ๋ง์คํฌ
- blockSize(optional)=3 : ์ฝ๋ ์ฃผ๋ณ ์์ญ์ ํฌ๊ธฐ
- useHarrisDetector(optional)=False : ์ฝ๋ ๊ฒ์ถ ๋ฐฉ๋ฒ ์ ํ (True: ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ, False: ์์ ํ ๋ง์ ์ฝ๋ ๊ฒ์ถ)
- k(optional) : ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ k ๊ณ์
- corners : ์ฝ๋ ๊ฒ์ถ ์ขํ ๊ฒฐ๊ณผ, N x 1 x 2 ํฌ๊ธฐ์ ๋ฐฐ์ด, ์ค์ ๊ฐ์ด๋ฏ๋ก ์ ์๋ก ๋ณํ ํ์
# ์์ ํ ๋ง์ ์ฝ๋ ๊ฒ์ถ
import cv2
import numpy as np
img = cv2.imread('img/house.jpg')
img1 = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# ์-ํ ๋ง์ค์ ์ฝ๋ ๊ฒ์ถ ๋ฉ์๋
corner1 = cv2.goodFeaturesToTrack(gray, 80, 0.01, 10)
# ์ค์ ์ขํ๋ฅผ ์ ์ ์ขํ๋ก ๋ณํ
corner1 = np.int32(corner1)
# ์ขํ์ ๋๊ทธ๋ผ๋ฏธ ํ์
for corner in corner1:
x, y = corner[0]
cv2.circle(img, (x, y), 5, (0,0,255), 1, cv2.LINE_AA)
# ----------------------------------------------------
# ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ ---โ
corner2 = cv2.cornerHarris(gray, 2, 3, 0.04)
# ๋ณํ๋ ๊ฒฐ๊ณผ์ ์ต๋๊ฐ 10% ์ด์์ ์ขํ ๊ตฌํ๊ธฐ ---โก
coord = np.where(corner2 > 0.1* corner2.max())
coord = np.stack((coord[1], coord[0]), axis=-1)
# ์ฝ๋ ์ขํ์ ๋๊ทธ๋ฆฌ๋ฏธ ๊ทธ๋ฆฌ๊ธฐ ---โข
for x, y in coord:
cv2.circle(img1, (x,y), 5, (0,0,255), 1, cv2.LINE_AA)
merged = np.hstack((img, img1))
cv2.imshow('Shi & Tomasi Detection, Harris Corner Detection', merged)
cv2.waitKey()
cv2.destroyAllWindows()
: ์-ํ ๋ง์ ๊ฒ์ถ๊ฐ ๋ ๋ง์ ์ฝ๋ ๊ฒ์ถ๋จ
4. ํน์ง์ ๊ฒ์ถ๊ธฐ
: ๊ฐ๊ฐ์ ํน์ง์ ๋ ์ขํ(x, y) ์ด์ธ์ ๋ค์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๋ค
: ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ๊ณผ ์-ํ ๋ง์ ๊ฒ์ถ์ ํจ์ ๋ฐํ ๊ฒฐ๊ณผ๋ ๋จ์ง ํน์ง์ ์ ์ขํ
: ํน์ง์ ๊ฒ์ถ๊ธฐ๋ค์ ๋ฐํ ๊ฒฐ๊ณผ๋ ํน์ง์ ์ ์ขํ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ์ ๋ณด๋ค๋ ํจ๊ป ๋ฐํ
keypoints = detector.detect(img, mask)
: ํน์ง์ ๊ฒ์ถ ํจ์
- img : ์
๋ ฅ ์ด๋ฏธ์ง
- mask(optional) : ๊ฒ์ถ ์ ์ธ ๋ง์คํฌ
- keypoints : ํน์ง์ ๊ฒ์ถ ๊ฒฐ๊ณผ (KeyPoint์ ๋ฆฌ์คํธ)
Keypoint
: ํน์ง์ ์ ๋ณด๋ฅผ ๋ด๋ ๊ฐ์ฒด
- pt : ํน์ง์ ์ขํ(x, y), float ํ์
์ผ๋ก ์ ์ ๋ณํ ํ์
- size : ์๋ฏธ ์๋ ํน์ง์ ์ด์์ ๋ฐ์ง๋ฆ
- angle : ํน์ง์ ๋ฐฉํฅ (์๊ณ๋ฐฉํฅ, -1=์๋ฏธ ์์)
- response : ํน์ง์ ๋ฐ์ ๊ฐ๋ (์ถ์ถ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฆ)
- octave : ๋ฐ๊ฒฌ๋ ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋ ๊ณ์ธต
- class_id : ํน์ง์ ์ด ์ํ ๊ฐ์ฒด ID
: detector.detect() ํจ์์ ๋ฐํ ๊ฒฐ๊ณผ์ธ Keypoints์๋ ๋ค์ํ ์ ๋ณด๋ค์ด ๋ด๊ฒจ์์
: Keypoints๋ ํน์ง์ ์ ์ขํ ์ ๋ณด์ธ pt ์์ฑ์ ํญ์ ๊ฐ์ง๋ง
๋๋จธ์ง ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ถ๊ธฐ์ ๋ฐ๋ผ ๋ฐํํ์ง ์์ ์๋ ์์
: ๊ฒ์ถํ ํน์ง์ ์ cv2.circle() ํจ์๋ฅผ ์ฌ์ฉํด์ ํ์ํ ์๋ ์์ง๋ง ํน์ง์ ์ ํ์ํด์ฃผ๋ ์ ์ฉ ํจ์๋ ๊ฐ๋ฅ
outImg = cv2.drawKeypoints(img, keypoints, outImg, color, flags)
: ํน์ง์ ์ ํ์ํด์ฃผ๋ ์ ์ฉ ํจ์
- img : ์
๋ ฅ ์ด๋ฏธ์ง
- keypoints : ํ์ํ ํน์ง์ ๋ฆฌ์คํธ
- outImg : ํน์ง์ ์ด ๊ทธ๋ ค์ง ๊ฒฐ๊ณผ ์ด๋ฏธ์ง
- color(optional) : ํ์ํ ์์ (default : ๋๋ค)
- flags(optional) : ํ์ ๋ฐฉ๋ฒ
- cv2.DRAW_MATCHES_FLAGS_DEFAULT : ์ขํ ์ค์ฌ์ ๋๊ทธ๋ผ๋ฏธ๋ง ๊ทธ๋ฆผ(default)
- cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS : ๋๊ทธ๋ผ๋ฏธ์ ํฌ๊ธฐ๋ฅผ size์ angle์ ๋ฐ์ํด์ ๊ทธ๋ฆผ
5. GFTTDetector
: cv2.goodFeaturesToTrack() ํจ์๋ก ๊ตฌํ๋ ํน์ง์ ๊ฒ์ถ๊ธฐ <์-ํ ๋ง์ ์ฝ๋ ๊ฒ์ถ ๋ฐฉ๋ฒ>
: GFTTDetector ๊ฒ์ถ๊ธฐ๋ฅผ ํ์ฉํ์ฌ ํน์ง์ ์ ๊ฒ์ถํ๋๋ฐ ์ฌ์ฉํ๋ ํจ์๋ detect() ํจ์์ ๊ฐ์
detector = cv2.GFTTDetector_create(img, maxCorners, qualityLevel, minDistance, corners, mask, blockSize, useHarrisDetector, k)
: GFTTDetector ํจ์์ ์์ฑ
- ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ cv2.goodFeaturesToTrack()๊ณผ ๋์ผ
- ๊ฒ์ถํ ๊ฒฐ๊ณผ๋ ํน์ง์ ์ขํ(pt) ์์ฑ๋ง ์๊ณ ๋๋จธ์ง ์์ฑ ๊ฐ์ ๋ชจ๋ ๋น์์
# GFTTDetector๋ก ํน์ง์ ๊ฒ์ถ
import cv2
import numpy as np
img = cv2.imread("img/house.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Good feature to trac ๊ฒ์ถ๊ธฐ ์์ฑ ---โ
gftt = cv2.GFTTDetector_create()
# ํน์ง์ ๊ฒ์ถ ---โก
keypoints = gftt.detect(gray, None)
# ํน์ง์ ๊ทธ๋ฆฌ๊ธฐ ---โข
img_draw = cv2.drawKeypoints(img, keypoints, None)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ ---โฃ
cv2.imshow('GFTTDectector', img_draw)
cv2.waitKey(0)
cv2.destrolyAllWindows()
: ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ๊ณผ ์์ ํ ๋ง์ ์ฝ๋ ๊ฒ์ถ๋ณด๋ค ๋ ๋ง์ ์ฝ๋๊ฐ ๊ฒ์ถ
: ํน์ง์ ์ ํ์ํ ๋๊ทธ๋ผ๋ฏธ์ ์์์ด ๋ค์
: ํน์ง์ ์ ํ์ํ๋ ํจ์์ธ cv2.drawKeypoints() ํจ์์์ color ์์ฑ์ ์ง์ ํ์ง ์์ผ๋ฉด ๋๋คํ ์์
6. FAST(Feature from Accelerated Segment Test)
: FAST๋ ๊ธฐ์กด ๊ฒ์ถ๊ธฐ๋ณด๋ค ์๋๊ฐ ๋น ๋ฅธ ๊ฒ์ถ๊ธฐ
: ์ฝ๋๋ฅผ ๊ฒ์ถํ ๋ ๋ฏธ๋ถ ์ฐ์ฐ์ ํ์ง ์์
: ํฝ์ ์ ์ค์ฌ์ผ๋ก ํน์ ๊ฐ์์ ํฝ์ ๋ก ์์ ๊ทธ๋ ค์ ๊ทธ ์์ ํฝ์ ๋ค์ด ์ค์ฌ ํฝ์ ๊ฐ๋ณด๋ค ์๊ณ ๊ฐ ์ด์ ๋ฐ๊ฑฐ๋ ์ด๋์ด ๊ฒ์ด ์ผ์ ๊ฐ์ ์ด์ ์ฐ์๋๋ฉด ์ฝ๋๋ก ํ๋จ
detector = cv2.FastFeatureDetector_create(threshold, nonmaxSuppression, type)
: ํน์ง์ ๊ฒ์ถ ์์๋ detect() ํจ์๋ฅผ ์ฌ์ฉ
- threshold(optional) : ์ฝ๋ ํ๋จ ์๊ณ ๊ฐ (default=10)
- nonmaxSuppression(optional) : ์ต๋ ์ ์๊ฐ ์๋ ์ฝ๋ ์ต์ (default=True)
- type(optional) : ์ฃ์ง ๊ฒ์ถ ํจํด
- cv2.FastFeatureDetector_TYPE_9_16 : 16๊ฐ ์ค 9๊ฐ ์ฐ์(default)
- cv2.FastFeatureDetector_TYPE_7_12 : 12๊ฐ ์ค 7๊ฐ ์ฐ์
- cv2.FastFeatureDetector_TYPE_5_8 : 8๊ฐ ์ค 5๊ฐ ์ฐ์
# FAST๋ก ํน์ง์ ๊ฒ์ถ
import cv2
import numpy as np
img = cv2.imread('img/house.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# FASt ํน์ง ๊ฒ์ถ๊ธฐ ์์ฑ ---โ
fast = cv2.FastFeatureDetector_create(50)
# ํน์ง์ ๊ฒ์ถ ---โก
keypoints = fast.detect(gray, None)
# ํน์ง์ ๊ทธ๋ฆฌ๊ธฐ ---โข
img = cv2.drawKeypoints(img, keypoints, None)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ ---โฃ
cv2.imshow('FAST', img)
cv2.waitKey()
cv2.destroyAllWindows()
7. SimpleBlobDetector
: BLOB(Binary Large Object)๋ ์ด์ง ์ค์ผ์ผ๋ก ์ฐ๊ฒฐ๋ ํฝ์ ๊ทธ๋ฃน
: SimpleBlobDetector๋ ์์ํ ๊ฐ์ฒด๋ ๋ ธ์ด์ฆ๋ก ์ฌ๊ธฐ๊ณ ํน์ ํฌ๊ธฐ ์ด์์ ํฐ ๊ฐ์ฒด๋ง ์ฐพ์๋ด๋ ๊ฒ์ถ๊ธฐ
detector = cv2.SimpleBlobDetector_create([parameters])
: BLOB ๊ฒ์ถ๊ธฐ ์์ฑ์
- cv2.SimpleBlobDetector_Params()
- minThreshold, maxThreshold, thresholdStep : BLOB๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฒฝ๊ณ ๊ฐ (minThreshold์์ maxThreshold๋ฅผ ๋์ง ์์ ๋๊น์ง thresholdStep๋งํผ ์ฆ๊ฐ)
- minRepeatability : BLOB์ ์ฐธ์ฌํ๊ธฐ ์ํ ์ฐ์๋ ๊ฒฝ๊ณ ๊ฐ์ ๊ฐ์
- minDistBetweenBlobs : ๋ BLOB์ ํ๋์ BLOB์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฑฐ๋ฆฌ
- filterByArea : ๋ฉด์ ํํฐ ์ต์
- minArea, maxArea : min~max ๋ฒ์์ ๋ฉด์ ๋ง BLOB์ผ๋ก ๊ฒ์ถ
- filterByCircularity : ์ํ ๋น์จ ํํฐ ์ต์
- minCircularity, maxCircularity : min~max ๋ฒ์์ ์ํ ๋น์จ๋ง BLOB์ผ๋ก ๊ฒ์ถ
- filterByColor : ๋ฐ๊ธฐ๋ฅผ ์ด์ฉํ ํํฐ ์ต์
- blobColor : 0 = ๊ฒ์์ BLOB ๊ฒ์ถ, 255 = ํฐ์ BLOB ๊ฒ์ถ
- filterByConvexity : ๋ณผ๋ก ๋น์จ ํํฐ ์ต์
- minConvexity, maxConvexity : min~max ๋ฒ์์ ๋ณผ๋ก ๋น์จ๋ง BLOB์ผ๋ก ๊ฒ์ถ
- filterByInertia : ๊ด์ฑ ๋น์จ ํํฐ ์ต์
- minInertiaRatio, maxInertiaRatio : min~max ๋ฒ์์ ๊ด์ฑ ๋น์จ๋ง BLOB์ผ๋ก ๊ฒ์ถ
# SimpleBolbDetector ๊ฒ์ถ๊ธฐ
import cv2
import numpy as np
img = cv2.imread("img/house.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# SimpleBlobDetector ์์ฑ ---โ
detector = cv2.SimpleBlobDetector_create()
# ํค ํฌ์ธํธ ๊ฒ์ถ ---โก
keypoints = detector.detect(gray)
# ํค ํฌ์ธํธ๋ฅผ ๋นจ๊ฐ์์ผ๋ก ํ์ ---โข
img = cv2.drawKeypoints(img, keypoints, None, (0,0,255),\
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("Blob", img)
cv2.waitKey(0)
: ์์ํ ์ฝ๋๋ ๋ ธ์ด์ฆ๋ก ๊ฐ์ฃผํ๊ณ ํน์ ํฌ๊ธฐ ์ด์์ ๊ฐ์ฒด๋ง ๊ฒ์ถ
+) SimpleBlobDetector์ ํํฐ ์ต์ ์ ์ฃผ์ด ์คํ
# ํํฐ ์ต์
์ผ๋ก ์์ฑํ SimpleBlobDetector ๊ฒ์ถ๊ธฐ
import cv2
import numpy as np
img = cv2.imread("img/house.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# blob ๊ฒ์ถ ํํฐ ํ๋ผ๋ฏธํฐ ์์ฑ ---โ
params = cv2.SimpleBlobDetector_Params()
# ๊ฒฝ๊ณ๊ฐ ์กฐ์ ---โก
params.minThreshold = 10
params.maxThreshold = 240
params.thresholdStep = 5
# ๋ฉด์ ํํฐ ์ผ๊ณ ์ต์ ๊ฐ ์ง์ ---โข
params.filterByArea = True
params.minArea = 200
# ์ปฌ๋ฌ, ๋ณผ๋ก ๋น์จ, ์ํ๋น์จ ํํฐ ์ต์
๋๊ธฐ ---โฃ
params.filterByColor = False
params.filterByConvexity = False
params.filterByInertia = False
params.filterByCircularity = False
# ํํฐ ํ๋ผ๋ฏธํฐ๋ก blob ๊ฒ์ถ๊ธฐ ์์ฑ ---โค
detector = cv2.SimpleBlobDetector_create(params)
# ํค ํฌ์ธํธ ๊ฒ์ถ ---โฅ
keypoints = detector.detect(gray)
# ํค ํฌ์ธํธ ๊ทธ๋ฆฌ๊ธฐ ---โฆ
img_draw = cv2.drawKeypoints(img, keypoints, None, None,\
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ ---โง
cv2.imshow("Blob with Params", img_draw)
cv2.waitKey(0)
: ์ด์ ๋ณด๋ค ๋ ๋ง์ ๊ฐ์ฒด ๊ฒ์ถ!
๋~
'๐ฉโ๐ป IoT (Embedded) > Image Processing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[v0.30]์์์ฒ๋ฆฌ_ํน์ง ๋งค์นญ(Feature Matching) (0) | 2022.01.16 |
---|---|
[v0.29]์์์ฒ๋ฆฌ_ํน์ง ๋์คํฌ๋ฆฝํฐ ๊ฒ์ถ๊ธฐ (0) | 2022.01.15 |
[v0.27]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง ๋งค์นญ (Image Matching) (0) | 2022.01.13 |
[v0.26]์์์ฒ๋ฆฌ_์ฐ์ ์์ญ ๋ถํ (0) | 2022.01.12 |
[v0.25]์์์ฒ๋ฆฌ_ํํ ๋ณํ (0) | 2022.01.12 |