๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[v0.29]์์์ฒ๋ฆฌ_ํน์ง ๋์คํฌ๋ฆฝํฐ ๊ฒ์ถ๊ธฐ ๋ณธ๋ฌธ
[v0.29]์์์ฒ๋ฆฌ_ํน์ง ๋์คํฌ๋ฆฝํฐ ๊ฒ์ถ๊ธฐ
์ง์ง์ํ์นด 2022. 1. 15. 23:59220115 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ๊ทํ์ด ์์ฌ๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
ํน์ง์ ์ด๋ ๋ง ๊ทธ๋๋ก ์ด๋ฏธ์ง์์ ํน์ง์ด ๋๋ ๋ถ๋ถ == ํคํฌ์ธํธ (keypoints)
1. ํน์ง ๋์คํฌ๋ฆฝํฐ
: ์ด ํน์ง์ ์ ๊ฐ์ฒด์ ์ขํ๋ฟ๋ง ์๋๋ผ ๊ทธ ์ฃผ๋ณ ํฝ์ ๊ณผ์ ๊ด๊ณ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๋ค
: ๊ฐ์ฅ ๋ํ์ ์ธ ๊ฒ์ด size์ angle ์์ฑ์ด๋ฉฐ, ์ฝ๋(corner)์ ์ธ ๊ฒฝ์ฐ ์ฝ๋์ ๊ฒฝ์ฌ๋์ ๋ฐฉํฅ๋ ์์ฑ์ผ๋ก ๊ฐ์ง
: ํน์ง ๋์คํฌ๋ฆฝํฐ(feature descriptor)๋
ํน์ง์ ์ฃผ๋ณ ํฝ์ ์ ์ผ์ ํ ํฌ๊ธฐ์ ๋ธ๋ก์ผ๋ก ๋๋์ด ๊ฐ ๋ธ๋ก์ ์ํ ํฝ์ ์ ๊ทธ๋ ๋์ธํธ ํ์คํ ๊ทธ๋จ์ ๊ณ์ฐํ ๊ฒ
์ฃผ๋ก ํน์ง์ ์ฃผ๋ณ์ ๋ฐ๊ธฐ, ์์, ๋ฐฉํฅ, ํฌ๊ธฐ ๋ฑ์ ์ ๋ณด๊ฐ ํฌํจ
: ์ถ์ถํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ํน์ง ๋์คํฌ๋ฆฝํฐ๊ฐ ์ผ๋ถ ๋ฌ๋ผ์ง ์๋ ์์
: ์ผ๋ฐ์ ์ผ๋ก ํน์ง์ ์ฃผ๋ณ์ ๋ธ๋ก ํฌ๊ธฐ์ 8๋ฐฉํฅ(์, ํ, ์ข, ์ฐ ๋ฐ ๋ค ๋ฐฉํฅ์ ๋๊ฐ์ ) ๊ฒฝ์ฌ๋๋ฅผ ํํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
: 4 x 4 ํฌ๊ธฐ์ ๋ธ๋ก์ธ ๊ฒฝ์ฐ ํ ๊ฐ์ ํน์ง์ ๋น 4 x 4 x 8 = 128๊ฐ์ ๊ฐ์ ๊ฐ์ง
keypoints, descriptors = detector.compute(image, keypoins, descriptors)
: ํน์ง์ ์ ์ ๋ฌํ๋ฉด ํน์ง ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ณ์ฐํด์ ๋ฐํ
keypoints, descriptors = detector.detectAndCompute(image, mask, decriptors, useProvidedKeypoints)
: ํน์ง์ ๊ฒ์ถ๊ณผ ํน์ง ๋์คํฌ๋ฆฝํฐ ๊ณ์ฐ์ ํ ๋ฒ์ ์ํ
- image : ์
๋ ฅ ์ด๋ฏธ์ง
- keypoints : ๋์คํฌ๋ฆฝํฐ ๊ณ์ฐ์ ์ํด ์ฌ์ฉํ ํน์ง์
- descriptors(optional) : ๊ณ์ฐ๋ ๋์คํฌ๋ฆฝํฐ
- mask(optional) : ํน์ง์ ๊ฒ์ถ์ ์ฌ์ฉํ ๋ง์คํฌ
- useProvidedKeypoints(optional) : True์ธ ๊ฒฝ์ฐ ํน์ง์ ๊ฒ์ถ์ ์ํํ์ง ์์
detector.compute() ํจ์
: ํน์ง ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ตฌํจ
: keypoints ํ๋ผ๋ฏธํฐ์ ํน์ง์ ์ ์ ๋ฌ
: ํน์ง์ ๊ฒ์ถ๊ธฐ๋ก ํน์ง์ ์ ํ๋ฒ ๊ฒ์ถํ๊ณ , ๊ทธ๋ค์ detector.compute() ํจ์๋ฅผ ์ฌ์ฉ
detector.detectAndCompute() ํจ์
: ํน์ง์ ๊ณผ ํน์ง ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋์์ ๊ณ์ฐ
: ์ฒ์๋ถํฐ detector.detectAndCompute() ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ ํธ๋ฆฌ
2. SIFT, SURF, ORB๋ ๋ชจ๋ ํน์ง ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ตฌํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ
1) SIFT (Scale-Invariant Feature Transform)
: ๊ธฐ์กด์ ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ ์๊ณ ๋ฆฌ์ฆ์ ํฌ๊ธฐ ๋ณํ์ ๋ฏผ๊ฐํ ๋ฌธ์ ๋ฅผ ๊ฐ์ง
: SIFT๋ ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋๋ฅผ ์ด์ฉํด์ ํฌ๊ธฐ ๋ณํ์ ๋ฐ๋ฅธ ํน์ง์ ๊ฒ์ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
detector = cv2.xfeatures2d.SIFT_create(nfeatures, nOctaveLayers, contrastThreshold, edgeThreshold, sigma)
- nfeatures : ๊ฒ์ถ ์ต๋ ํน์ง ์
- nOctaveLayers : ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋์ ์ฌ์ฉํ ๊ณ์ธต ์
- contrastThreshold : ํํฐ๋งํ ๋น์ฝํ ํน์ง ๋ฌธํฑ ๊ฐ
- edgeThreshold : ํํฐ๋งํ ์ฃ์ง ๋ฌธํฑ ๊ฐ
- sigma : ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋ 0 ๊ณ์ธต์์ ์ฌ์ฉํ ๊ฐ์ฐ์์ ํํฐ์ ์๊ทธ๋ง ๊ฐ
# SIFT๋ก ํน์ง์ ๋ฐ ๋์คํฌ๋ฆฝํฐ ์ถ์ถ
import cv2
import numpy as np
img = cv2.imread('img/house.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# SIFT ์ถ์ถ๊ธฐ ์์ฑ
sift = cv2.xfeatures2d.SIFT_create()
# ํค ํฌ์ธํธ ๊ฒ์ถ๊ณผ ์์ ์ ๊ณ์ฐ
keypoints, descriptor = sift.detectAndCompute(gray, None)
print('keypoint:',len(keypoints), 'descriptor:', descriptor.shape)
print(descriptor)
# ํค ํฌ์ธํธ ๊ทธ๋ฆฌ๊ธฐ
img_draw = cv2.drawKeypoints(img, keypoints, None, \
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
cv2.imshow('SIFT', img_draw)
cv2.waitKey()
cv2.destroyAllWindows()
2) SURF (Speeded Up Robust Features)
: SIFT๋ ํฌ๊ธฐ ๋ณํ์ ๋ฐ๋ฅธ ํน์ง ๊ฒ์ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์๋๊ฐ ๋๋ฆฌ๋ค
: SURF๋ ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋ ๋์ ํํฐ์ ํฌ๊ธฐ๋ฅผ ๋ณํ์ํค๋ ๋ฐฉ์์ผ๋ก ์ฑ๋ฅ์ ๊ฐ์
detector = cv2.xfeatures2d.SURF_create(hessianThreshold, nOctaves, nOctaveLayers, extended, upright)
- hessianThreshold(optional) : ํน์ง ์ถ์ถ ๊ฒฝ๊ณ ๊ฐ (default=100)
- nOctaves(optional) : ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋ ๊ณ์ธต ์ (default=3)
- extended(optional) : ๋์คํฌ๋ฆฝํฐ ์์ฑ ํ๋๊ทธ (default=False), True: 128๊ฐ, False: 64๊ฐ
- upright(optional) : ๋ฐฉํฅ ๊ณ์ฐ ํ๋๊ทธ (default=False), True: ๋ฐฉํฅ ๋ฌด์, False: ๋ฐฉํฅ ์ ์ฉ
# SURF๋ก ํน์ง์ ๋ฐ ํน์ง ๋์คํฌ๋ฆฝํฐ ์ถ์ถ
import cv2
import numpy as np
img = cv2.imread('img/house.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# SURF ์ถ์ถ๊ธฐ ์์ฑ ( ๊ฒฝ๊ณ:1000, ํผ๋ผ๋ฏธ๋:3, ์์ ์ํ์ฅ:True, ๋ฐฉํฅ์ ์ฉ:True)
surf = cv2.xfeatures2d.SURF_create(1000, 3, True, True)
# ํค ํฌ์ธํธ ๊ฒ์ถ ๋ฐ ์์ ์ ๊ณ์ฐ
keypoints, desc = surf.detectAndCompute(gray, None)
print(desc.shape, desc)
# ํคํฌ์ธํธ ์ด๋ฏธ์ง์ ๊ทธ๋ฆฌ๊ธฐ
img_draw = cv2.drawKeypoints(img, keypoints, None, \
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('SURF', img_draw)
cv2.waitKey()
cv2.destroyAllWindows()
- opencv ๋ฒ์ ์ด ์๋ง์์ ์๋ฌ๊ฐ ๋๋ค
- ํน์ง์ : 104๊ฐ, ๊ฐ ํน์ง์ ๋ง๋ค 128๊ฐ์ ๋์คํฌ๋ฆฝํฐ ๊ฐ ์ฌ์ฉ
3) ORB (Oriented and Rotated BRIEF)
: ๋์คํฌ๋ฆฝํฐ ๊ฒ์ถ๊ธฐ ์ค BRIEF(Binary Robust Independent Elementary Features)๋ผ๋ ๊ฒ์ด ์์
: BRIEF๋ ํน์ง์ ๊ฒ์ถ์ ์ง์ํ์ง ์๋ ๋์คํฌ๋ฆฝํฐ ์ถ์ถ๊ธฐ
: BRIEF์ ๋ฐฉํฅ๊ณผ ํ์ ์ ๊ณ ๋ คํ๋๋ก ๊ฐ์ ํ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฐ๋ก ORB
: ํน์ง์ ๊ฒ์ถ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก FAST๋ฅผ ์ฌ์ฉํ๊ณ ํ์ ๊ณผ ๋ฐฉํฅ์ ๊ณ ๋ คํ๋๋ก ๊ฐ์ ํ์ผ๋ฉฐ ์๋๋ ๋นจ๋ผ SIFT์ SURF์ ์ข์ ๋์์ผ๋ก ์ฌ์ฉ
detector = cv2.ORB_create(nfeatures, scaleFactor, nlevels, edgeThreshold, firstLevel, WTA_K, scoreType, patchSize, fastThreshold)
- nfeatures(optional) : ๊ฒ์ถํ ์ต๋ ํน์ง ์ (default=500)
- scaleFactor(optional) : ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋ ๋น์จ (default=1.2)
- nlevels(optional) : ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋ ๊ณ์ธต ์ (default=8)
- edgeThreshold(optional) : ๊ฒ์์์ ์ ์ธํ ํ
๋๋ฆฌ ํฌ๊ธฐ, patchSize์ ๋ง์ถ ๊ฒ (default=31)
- firstLevel(optional) : ์ต์ด ์ด๋ฏธ์ง ํผ๋ผ๋ฏธ๋ ๊ณ์ธต ๋จ๊ณ (default=0)
- WTA_K(optional) : ์์ ์ขํ ์์ฑ ์ (default=2)
- scoreType(optional) : ํน์ง์ ๊ฒ์ถ์ ์ฌ์ฉํ ๋ฐฉ์
- cv2.ORB_HARRIS_SCORE : ํด๋ฆฌ์ค ์ฝ๋ ๊ฒ์ถ(default)
- cv2.ORB_FAST_SCORE : FAST ์ฝ๋ ๊ฒ์ถ
- patchSize(optional) : ๋์คํฌ๋ฆฝํฐ์ ํจ์น ํฌ๊ธฐ (default=31)
- fastThreshold(optional) : FAST์ ์ฌ์ฉํ ์๊ณ ๊ฐ (default=20)
# ORB๋ก ํน์ง์ ๋ฐ ํน์ง ๋์คํฌ๋ฆฝํฐ ๊ฒ์ถ
import cv2
import numpy as np
img = cv2.imread('img/house.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# ORB ์ถ์ถ๊ธฐ ์์ฑ
orb = cv2.ORB_create()
# ํค ํฌ์ธํธ ๊ฒ์ถ๊ณผ ์์ ์ ๊ณ์ฐ
keypoints, descriptor = orb.detectAndCompute(img, None)
# ํค ํฌ์ธํธ ๊ทธ๋ฆฌ๊ธฐ
img_draw = cv2.drawKeypoints(img, keypoints, None, \
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
cv2.imshow('ORB', img_draw)
cv2.waitKey()
cv2.destroyAllWindows()
- ๋ญ๊ฐ ์ข์๋ณด์ด์ง ์๋๋ฐ..
- none ์ผ๋ก ํด์ ๊ทธ๋ฐ๊ฐ
# ORB ์ถ์ถ๊ธฐ ์์ฑ
orb = cv2.ORB_create(100, 1.2, 8, 31, 0, 2, cv2.ORB_FAST_SCORE, 31, 20)
- ์ด๊ฑฐ ์ถ๊ฐ ํ๋๋..
'๐ฉโ๐ป IoT (Embedded) > Image Processing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[v0.31]์์์ฒ๋ฆฌ_์ฌ๋ฐ๋ฅธ ๋งค์นญ์ ์ฐพ๊ธฐ (0) | 2022.01.17 |
---|---|
[v0.30]์์์ฒ๋ฆฌ_ํน์ง ๋งค์นญ(Feature Matching) (0) | 2022.01.16 |
[v0.28]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง์ ํน์ง์ , ํน์ง์ ๊ฒ์ถ๊ธฐ (0) | 2022.01.15 |
[v0.27]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง ๋งค์นญ (Image Matching) (0) | 2022.01.13 |
[v0.26]์์์ฒ๋ฆฌ_์ฐ์ ์์ญ ๋ถํ (0) | 2022.01.12 |