๐ ๋ณธ ์์ ๋ Window10์ VSCode, Python3.11.0๋ก ์์ฑ๋์์ต๋๋ค.
๊ฐ์ฒด ๊ฒ์ถ(Object Detecting)
์ ๋ ฅ ์์์์ ์์ ํฌ๊ธฐ์ ๋ถ๋ถ ์์์ ์์น๋ฅผ ์ฐพ์ ๋ด๊ณ ์ถ์ ๊ฒฝ์ฐ ํ ํ๋ฆฟ ๋งค์นญ(Template Matching) ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
ํ ํ๋ฆฟ์ ์ฐพ๊ณ ์ ํ๋ ๋์์ด ๋๋ ์์ ํฌ๊ธฐ์ ์์์ ์๋ฏธํ๋ค.
ํ ํ๋ฆฟ ๋งค์นญ์ ์ด ํ ํ๋ฆฟ์ ์ ๋ ฅ ์์ ์ ์ฒด ์์ญ์ ๋ํด ์ด๋ํ๋ฉด์ ๊ฐ์ฅ ๋น์ทํ ์์น๋ฅผ ์์ง์ ์ผ๋ก ์ฐพ์๋ด๋ ๋ฐฉ์์ด๋ค.
- ์ ์ฌํ ๊ฒ์ ์ฐพ๋ ๋ฐฉ์์ ํ ํ๋ฆฟ๊ณผ ์ ๋ ฅ ์์๊ฐ์ ์ ์ฌ๋(Similarity) ๋๋ ๋น์ ์ฌ๋(Dissimilarity)๋ฅผ ๊ณ์ฐํ๋ค.
- ์ ์ฌ๋ ๊ณ์ฐ : ํ ํ๋ฆฟ ์์๊ณผ ๋น์ทํ ๋ถ๋ถ ์์ ์์น์์ ๊ฐ์ด ํฌ๊ฒ ๋ํ๋จ.
- ๋น์ ์ฌ๋ ๊ณ์ฐ : ํ ํ๋ฆฟ ์์๊ณผ ๋น์ทํ ๋ถ๋ถ์์ ๊ฐ์ด ์๊ฒ ๋ํ๋จ.
import cv2
image = cv2.imread("test.png")
image = cv2.resize(image,(int(image.shape[1]//2),int(image.shape[0]//2)),interpolation=cv2.INTER_LANCZOS4)
template = cv2.imread("template.png")
template = cv2.resize(template,(int(template.shape[1]//2),int(template.shape[0]//2)),interpolation=cv2.INTER_LANCZOS4)
h,w,_ = template.shape
# Template Matching
result = cv2.matchTemplate(image,template,cv2.TM_CCOEFF_NORMED)
# TM_CCOEFF: ์๊ด ๊ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์นญ์ ์ํํฉ๋๋ค. ๊ฐ์ด ํด์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์
๋๋ค.
# TM_CCOEFF_NORMED: ์ ๊ทํ๋ ์๊ด ๊ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฒฐ๊ณผ ๊ฐ์ 0๊ณผ 1 ์ฌ์ด๋ก, 1์ ๊ฐ๊น์ธ์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์
๋๋ค.
# TM_CCORR: ์๊ด์ ์ฌ์ฉํ์ฌ ๋งค์นญํฉ๋๋ค. ๊ฐ์ด ํด์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์
๋๋ค.
# TM_CCORR_NORMED: ์ ๊ทํ๋ ์๊ด์ ์ฌ์ฉํฉ๋๋ค. ๊ฒฐ๊ณผ ๊ฐ์ 0๊ณผ 1 ์ฌ์ด์
๋๋ค.
# TM_SQDIFF: ์ ๊ณฑ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ ๋งค์นญํฉ๋๋ค. ๊ฐ์ด ์์์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์
๋๋ค.
# TM_SQDIFF_NORMED: ์ ๊ทํ๋ ์ ๊ณฑ ์ฐจ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฒฐ๊ณผ ๊ฐ์ 0๊ณผ 1 ์ฌ์ด๋ก, 0์ ๊ฐ๊น์ธ์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์
๋๋ค.
# ๋งค์นญ ๊ฒฐ๊ณผ์์ ์ต๋๊ฐ๊ณผ ์์น๋ฅผ ์ฐพ๋๋ค.
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# ํ
ํ๋ฆฟ์ ์์น๋ฅผ ์ฌ๊ฐํ์ผ๋ก ๊ทธ๋ฆฐ๋ค.
top_left = max_loc
bottom_right = (top_left[0]+w,top_left[1]+h)
cv2.rectangle(image,top_left,bottom_right,(0,255,0),2)
cv2.imshow("Template",template)
cv2.imshow("Template Matching",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
ํ ํ๋ฆฟ ๋งค์นญ ๋น๊ต ๋ฐฉ์ ๋ฉ์๋
- TM_CCOEFF: ์๊ด ๊ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์นญ์ ์ํํ๋ค. ๊ฐ์ด ํด์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์ด๋ค.
- TM_CCOEFF_NORMED: ์ ๊ทํ๋ ์๊ด ๊ณ์๋ฅผ ์ฌ์ฉํ๋ค. ๊ฒฐ๊ณผ ๊ฐ์ 0๊ณผ 1 ์ฌ์ด๋ก, 1์ ๊ฐ๊น์ธ์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์ ๋๋ค.
- TM_CCORR: ์๊ด์ ์ฌ์ฉํ์ฌ ๋งค์นญํ๋ค. ๊ฐ์ด ํด์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์ด๋ค.
- TM_CCORR_NORMED: ์ ๊ทํ๋ ์๊ด์ ์ฌ์ฉํ๋ค. ๊ฒฐ๊ณผ ๊ฐ์ 0๊ณผ 1 ์ฌ์ด๋ค.
- TM_SQDIFF: ์ ๊ณฑ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ์ฌ ๋งค์นญํ๋ค. ๊ฐ์ด ์์์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์ด๋ค.
- TM_SQDIFF_NORMED: ์ ๊ทํ๋ ์ ๊ณฑ ์ฐจ์ด๋ฅผ ์ฌ์ฉํ๋ค. ๊ฒฐ๊ณผ ๊ฐ์ 0๊ณผ 1 ์ฌ์ด๋ก, 0์ ๊ฐ๊น์ธ์๋ก ๋งค์นญ์ด ์ ๋๋ ๊ฒ์ด๋ค.
Cascade Classifier
์บ์ค์ผ์ด๋ ๋ถ๋ฅ๊ธฐ(Cascade Classifier)๋ ์ฌ๋ฌ ๋จ๊ณ์ ๋ถ๋ฅ๊ธฐ๋ฅผ ์ฐ์์ ์ผ๋ก ์ ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๊ฒ์ถํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฃผ๋ก Haar ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ์ด๋ฏธ์ง์์ ํน์ ํจํด์ด๋ ๊ฐ์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ์ธ์ํ ์ ์๋๋ก ์ค๊ณ๋์๋ค.
์บ์ค์ผ์ด๋ ๊ตฌ์กฐ๋ก ๋์ด์์ด, ์ด๊ธฐ ๋จ๊ณ์ ๊ฐ๋จํ ํน์ง์ ๊ฒ์ฌ, ์ดํ ๋จ๊ณ๋ฅผ ์งํํ ์๋ก ๋ ๋ณต์กํ ํน์ง์ ๊ฒ์ฌํ๊ฒ ๋๋ค.
์ด๋ฌํ ๊ตฌ์กฐ๋ก ๋ถํ์ํ ๊ณ์ฐ์ ์ค์ด๊ณ , ์๋๋ฅผ ๋์ผ ์ ์๋ค.
์บ์ค์ผ์ด๋ ๋ถ๋ฅ๊ธฐ์ ๋ถ๋ฅ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ๋ค.(ex. ์ผ๊ตด)
- ์์ ์ ๋ ฅ : 1๋จ๊ณ๋ก
- 1๋จ๊ณ(ํน์ง ํ๊ฐ ์ฌ์ฉ) : Pass ๊ฒฝ์ฐ ๋ค์ ๋จ๊ณ, Fail ๊ฒฝ์ฐ ์ผ๊ตด ์๋
- 2๋จ๊ณ(ํน์ง ๋ค์ฏ๊ฐ ์ฌ์ฉ) : Pass ๊ฒฝ์ฐ ๋ค์ ๋จ๊ณ, Fail ๊ฒฝ์ฐ ์ผ๊ตด ์๋
- 3๋จ๊ณ(ํน์ง 20๊ฐ ์ฌ์ฉ) : Pass ๊ฒฝ์ฐ ๋ค์ ๋จ๊ณ, Fail ๊ฒฝ์ฐ ์ผ๊ตด ์๋
- ....
- ์ต์ข ๋จ๊ณ(ํน์ง n๊ฐ ์ฌ์ฉ) : Pass์ ๊ฒฝ์ฐ ์ผ๊ตด, Fail ๊ฒฝ์ฐ ์ผ๊ตด ์๋
์บ์ค์ผ์ด๋ ๋ถ๋ฅ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ฌ๊ธฐ์ ์ฌ์ ํ์ต ๋ ๋ถ๋ฅ๊ธฐ ํ์ผ์ด ํ์ํ๋ค.
import cv2
image = cv2.imread("human.jpg")
image = cv2.resize(image,(int(image.shape[1]//2),int(image.shape[0]//2)),interpolation=cv2.INTER_LANCZOS4)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# ๋ถ๋ฅ๊ธฐ ๋ก๋
eye_cascade = cv2.CascadeClassifier("haarcascade_eye.xml")
# ๋ ๊ฒ์ถ
eyes = eye_cascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(60,60))
# ๋ฐ์ด๋ฉ ๋ฐ์ค
for (x, y, w, h) in eyes:
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.imshow("Cascade Classifier",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
HOG ์๊ณ ๋ฆฌ์ฆ์ ํตํ ๋ณดํ์ ๊ฒ์ถ
HOG(Histogram of Oriented Gradients)๋ ์ด๋ฏธ์ง ๊ธฐ์ธ๊ธฐ ๋ฐฉํฅ๊ณผ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ํน์ง ์ถ์ถ ๋ฐฉ๋ฒ์ด๋ค.
์ด ๋ฐฉ๋ฒ์ ๊ฐ์ฒด์ ๋ชจ์์ ํํํ๋๋ฐ ๊ฐ๋ ฅํ ์ฑ๋ฅ์ ๋ณด์ด๋ฉฐ, ํนํ ๋ณดํ์์ ๊ฐ์ ์ฌ๋์ ํํ๋ฅผ ์ธ์ํ๋๋ฐ ํจ๊ณผ์ ์ด๋ค.
- ์ด๋ฏธ์ง์์ ์์ ์ (cell)๋ก ๋๋๊ณ , ๊ฐ ์ ์ ๊ธฐ์ธ๊ธฐ ๋ฐฉํฅ์ ๊ณ์ฐํ๋ค.
- ๊ฐ ์ ์์ ๊ธฐ์ธ๊ธฐ ๋ฐฉํฅ์ ํ์คํ ๊ทธ๋จ์ ์์ฑ, ์ด๋ฅผ ๊ฒฐํฉํด ์ ์ฒด ์ด๋ฏธ์ง์ ํน์ง ๋ฒกํฐ๋ฅผ ๋ง๋ ๋ค.
import cv2
# HOG ๋ถ๋ฅ๊ธฐ ์ด๊ธฐํ
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ
image = cv2.imread('people.jpg')
# ๋ณดํ์ ๊ฒ์ถ
boxes, weights = hog.detectMultiScale(image, winStride=(8, 8), padding=(8, 8), scale=1.05)
# ๊ฒ์ถ๋ ๋ณดํ์์ ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
for (x, y, w, h) in boxes:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ํ์
cv2.imshow('Detected Pedestrians', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
QR ์ฝ๋ ๊ฒ์ถ
import cv2
# ์ด๋ฏธ์ง ํ์ผ ์ฝ๊ธฐ
image = cv2.imread('qr.png')
if image is None:
pass
else:
# QR ์ฝ๋ ๊ฒ์ถ๊ธฐ ์ด๊ธฐํ
detector = cv2.QRCodeDetector()
# QR ์ฝ๋ ๊ฒ์ถ
data, bbox, _ = detector.detectAndDecode(image)
# ๊ฒ์ถ๋ ๋ฐ์ดํฐ ์ถ๋ ฅ
if data:
print("QR ์ฝ๋ ๋ด์ฉ:", data)
# QR ์ฝ๋์ ๊ฒฝ๊ณ ์์ ๊ทธ๋ฆฌ๊ธฐ
if bbox is not None:
for i in range(len(bbox)):
cv2.polylines(image, [bbox[i].astype(int)], isClosed=True, color=(0, 255, 0), thickness=2)
# ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ํ์
cv2.imshow('QR Code Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
'AI > Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Computer Vision] PIL(Python Image Library) (0) | 2024.09.08 |
---|---|
[Computer Vision] ์ง์ญ ํน์ง์ ๊ฒ์ถ๊ณผ ๋งค์นญ (0) | 2024.09.07 |
[Computer Vision] ๋ ์ด๋ธ๋ง๊ณผ ์ธ๊ฐ์ ๊ฒ์ถ (0) | 2024.09.04 |
[Computer Vision] ์์์ ์ด์งํ์ ๋ชจํด๋ก์ง (0) | 2024.09.03 |
[Computer Vision] ์ปฌ๋ฌ ์์ ์ฒ๋ฆฌ (0) | 2024.09.02 |