๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Computer Vision

MediaPipe๋ฅผ ์ด์šฉํ•˜์—ฌ Hand Tracking & ์† ๋™์ž‘ ์ธ์‹ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ

728x90
๋ฐ˜์‘ํ˜•

 ๊ตฌํ˜„ ๋™๊ธฐ

๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ์˜ AR ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , ๋‹ค๋ฅธ AR ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŽ์ด ๋ณด๋ฉด์„œ ๋Š๋‚€ ๊ฒŒ ํ•œ ๊ฐ€์ง€ ์žˆ๋‹ค๋ฉด ๋Œ€๊ฐœ ์‚ฌ์šฉ์žํ•œํ…Œ ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ ์Šค๋งˆํŠธํฐ ํ„ฐ์น˜๋กœ ๋ฐ›๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค. ์ด๋Ÿฐ ์ ์— ์•ฝ๊ฐ„์˜ ์•„์‰ฌ์›€์ด ์žˆ์–ด ์ง์ ‘ ์†์„ ์ถ”์ ํ•˜์—ฌ, AR ๋กœ ์ฆ๊ฐ•ํ•œ ์˜ค๋ธŒ์ ํŠธ์™€ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•ด ๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. 

์–ผ๋งˆ ์ „์—, ๋ฐœํ‘œํ•œ ์• ํ”Œ์˜ Vision Pro์—์„œ์˜ ์ปจํŠธ๋กค๋Ÿฌ ์—†๋Š” ์žฅ๋ฉด์ด ์ธ์ƒ ๊นŠ์€๋ฐ, ๋””๋ฐ”์ด์Šค๊ฐ€ ๊ธ€๋ž˜์Šค์™€ ์Šค๋งˆํŠธํฐ์ด๋ƒ์— ์ฐจ์ด ์ผ ๋ฟ ๋‚ด๊ฐ€ ์ƒ์ƒํ•˜๋Š” ๊ทธ๋ฆผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค.

์ฐพ์•„๋ณด๋‹ˆ, Unity ์—”์ง„ ์ž์ฒด์—๋Š” ์•„์ง ์† ๋™์ž‘์„ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์‹์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†์–ด ๋ณด์˜€๋‹ค.

๊ทธ๋ ‡๊ธฐ์—, ์™ธ๋ถ€์—์„œ ์ œ์Šค์ฒ˜ ์ธ์‹, ์† ๋™์ž‘ ๋ฐ์ดํ„ฐ๋ฅผ Unity ์—”์ง„์—์„œ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค.

 

 

 MediaPipe๋Š” ๋ฌด์—‡์ธ๊ฐ€?

Hand LandMark (ํ•ธ๋“œ ๋žœ๋“œ๋งˆํฌ)

์† ๋™์ž‘ ์ธ์‹์„ ์œ„ํ•ด MediaPipe๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. MediaPipe๋Š” ์‹ค์‹œ๊ฐ„ ๋น„์ „ ๋ฐ ์˜ค๋””์˜ค ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ณ , ๊ตฌ๊ธ€์—์„œ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค. ์ฃผ๋กœ, ์ปดํ“จํ„ฐ๋น„์ „, ์ œ์Šค์ฒ˜ ์ธ์‹, ๊ฐ์ฒด ์ถ”์ , ์–ผ๊ตด ๊ฐ์ง€ ๋“ฑ์˜ ์ž‘์—…์— ์‚ฌ์šฉ๋œ๋‹ค.

 

ML(๋จธ์‹  ๋Ÿฌ๋‹)์„ ์‚ฌ์šฉํ•˜์—ฌ ์†๋งˆ๋‹ค 21๊ฐœ์˜ 3D ๋žœ๋“œ๋งˆํฌ๋ฅผ ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์ถ”๋ก ํ•˜๋Š”๋ฐ, ํœด๋Œ€ํฐ์—์„œ๋„ ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๊ณ  2๊ฐœ ์ด์ƒ์˜ ์†์„ ์ธ์‹ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์›๋ฆฌ๋Š” ๊ฐ„๋žตํ•˜๊ฒŒ ๋ชจ๋“  ์ด๋ฏธ์ง€์—์„œ ์†์„ ๊ฐ์ง€ํ•˜์—ฌ ์† ๊ฒฝ๊ณ„ ๋ฐ•์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Palm Detection Model (์†๋ฐ”๋‹ฅ ๊ฐ์ง€ ๋ชจ๋ธ) ํ™œ์šฉ ํ›„ ์ถ”์ถœ๋œ ์ด๋ฏธ์ง€ ์˜์—ญ์— 3D ํ•ธ๋“œ ํ‚คํฌ์ธํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Hand Landmark Model (ํ•ธ๋“œ ๋žœ๋“œ ๋งˆํฌ ๋ชจ๋ธ)์ด ์ด์šฉ๋œ๋‹ค.

 

์ข€ ๋” ์ž์„ธํžˆ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

https://puleugo.tistory.com/10

 

[ํŒŒ์ด์ฌ] MediaPipe ์† ์ธ์‹(Hands)

์›๋ฌธ : https://google.github.io/mediapipe/solutions/hands ๊ฐœ์š” ์†์˜ ๋ชจ์–‘๊ณผ ์›€์ง์ž„์„ ์ธ์‹ํ•˜๋Š” ๋Šฅ๋ ฅ์€ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ  ์˜์—ญ๊ณผ ํ”Œ๋žซํผ์—์„œ ์„œ๋น„์Šค ์ด์šฉ์ž์—๊ฒŒ ์ข‹์€ ์ธ์‹์„ ์ค„ ์ˆ˜์žˆ๋Š” ์ค‘์š”ํ•œ ์š”์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ

puleugo.tistory.com

 

 

 

 

 

 

 

 PyCharm์—์„œ ์† ๋™์ž‘ ์ธ์‹ ๊ตฌํ˜„ํ•˜๊ธฐ

๊ฐœ๋ฐœํ™˜๊ฒฝ์€ PyCharm์„ ์ด์šฉํ•ด์„œ Python ์ฝ”๋“œ๋กœ ๊ตฌํ˜„์„ ์‰ฝ๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ, ์›น์บ (Webcam)์ด ๋”ฐ๋กœ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ํœด๋Œ€ํฐ ์นด๋ฉ”๋ผ๋ฅผ ํ™œ์šฉํ•œ IP WebCam ์–ดํ”Œ์„ Play Store์—์„œ ๋‹ค์šด๋ฐ›์•„์„œ ์‹œ์ž‘ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

PyCharm์ด ์„ค์น˜๋˜์—ˆ๋‹ค๋ฉด, File - Settings ํด๋ฆญ

 

ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ CvZone ์™€ MediaPipe๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ Install ํ•ด์ค๋‹ˆ๋‹ค.

CvZone์€ OpenCV์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์–ผ๊ตด์ธ์‹, ๋žœ๋“œ๋งˆํฌ ๊ฐ์ง€, ์ž์„ธ ์ถ”์ •, ๋™์ž‘ ์ธ์‹ ๋“ฑ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

 

CVZone์„ ๋งŒ์•ฝ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ Install ํ•˜๊ณ , ์•„๋ž˜์™€ ๊ฐ™์ด Import๋ฅผ ์‹œ์ผœ์ฃผ์—ˆ๋Š”๋ฐ

import cv2

OpenCV์— ๊ด€ํ•ด ์ž๋™ ์™„์„ฑ์ด ์ง„ํ–‰์ด ์•ˆ ๋œ๋‹ค๋ฉด, OpenCV-Python์„ 4.5.5.64๋กœ ๋‚ฎ์ถฐ์„œ ๋‹ค์‹œ ์„ค์น˜๋ฅผ ํ•ด์ฃผ์‹œ๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž๋™ ์™„์„ฑ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

 

import cv2
from cvzone.HandTrackingModule import HandDetector

# IP WebCam ์–ดํ”Œ์„ ์‚ฌ์šฉ ํ•  ๊ฒฝ์šฐ
cap = cv2.VideoCapture("http://Your IP Number/video")
# WebCam ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ
cap = cv2.VideoCapture(0)


# ์†์„ ๊ฐ์ง€
detector = HandDetector(maxHands=1, detectionCon=0.8)

while True:
# ์›น์ผ์—์„œ ํ”„๋ ˆ์ž„ ๊ฐ€์ ธ์˜ค๊ธฐ
success, img = cap.read()

# Hands
hands, img = detector.findHands(img)

cv2.imshow("Image", img)

if cv2.waitKey(1) == ord("q"): # q ๋ˆ„๋ฅผ ์‹œ ์›น์ผ ์ข…๋ฃŒ
break
์œ„ ์ฝ”๋“œ๋Š” ์›น์ผ์œผ๋กœ๋ถ€ํ„ฐ ์˜์ƒ์„ ๋ฐ›์•„์™€ ์‚ฌ์šฉ์ž์˜ ์†์„ ๊ฐ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ฝ”๋“œ์˜ ๊ฐ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.
 
1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž„ํฌํŠธ:
- `import cv2`: OpenCV ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž„ํฌํŠธํ•ฉ๋‹ˆ๋‹ค.
OpenCV๋Š” ์˜์ƒ ์ฒ˜๋ฆฌ์™€ ์ปดํ“จํ„ฐ ๋น„์ „ ์ž‘์—…์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
- `from cvzone.HandTrackingModule import HandDetector`: cvzone ํŒจํ‚ค์ง€์—์„œ HandDetector ๋ชจ๋“ˆ์„ ์ž„ํฌํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์€ ์†์„ ๊ฐ์ง€ํ•˜๊ณ  ์ถ”์ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

2. IP ์›น์บ  ์„ค์ •:
- `cap = cv2.VideoCapture(0)`: ์›น์บ ์—์„œ ์˜์ƒ์„ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด `cv2.VideoCapture` ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. `0`์€ ๊ธฐ๋ณธ ์›น์บ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

3. ์† ๊ฐ์ง€ ๊ฐ์ฒด ์ƒ์„ฑ:
- `detector = HandDetector(maxHands=1, detectionCon=0.8)`: `HandDetector` ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. `maxHands`๋Š” ๊ฐ์ง€ํ•  ์†์˜ ์ตœ๋Œ€ ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, `detectionCon`์€ ์†์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์‹ ๋ขฐ๋„ ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

4. ์˜์ƒ ์ฒ˜๋ฆฌ ๋ฃจํ”„:
- `while True:`: ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
- `success, img = cap.read()`: ์›น์บ ์—์„œ ํ”„๋ ˆ์ž„์„ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
 `success`๋Š” ํ”„๋ ˆ์ž„ ์ฝ๊ธฐ๊ฐ€ ์„ฑ๊ณตํ–ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์ด๊ณ , `img`๋Š” ์ฝ์–ด์˜จ ํ”„๋ ˆ์ž„ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

5. ์† ๊ฐ์ง€:
- `hands, img = detector.findHands(img)`: `HandDetector` ๊ฐ์ฒด์˜ `findHands()` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. `img`์—๋Š” ์† ๊ฐ์ง€ ๊ฒฐ๊ณผ๊ฐ€ ๊ทธ๋ ค์ง„ ์ด๋ฏธ์ง€๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ , `hands`์—๋Š” ๊ฐ์ง€๋œ ์†์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

6. ์˜์ƒ ์ถœ๋ ฅ:
- `cv2.imshow("Image", img)`: `img`์— ์ €์žฅ๋œ ์ด๋ฏธ์ง€๋ฅผ "Image"๋ผ๋Š” ์ฐฝ์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

7. ์ข…๋ฃŒ ์กฐ๊ฑด:
- `if cv2.waitKey(1) == ord("q"):`: ์‚ฌ์šฉ์ž๊ฐ€ "q" ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
- `cv2.waitKey(1)`: ์‚ฌ์šฉ์ž์˜ ํ‚ค ์ž…๋ ฅ์„ 1๋ฐ€๋ฆฌ์ดˆ ๋™์•ˆ ๋Œ€๊ธฐํ•˜๊ณ , ์ž…๋ ฅ์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํ‚ค์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
- `ord("q")`: ๋ฌธ์ž "q"์˜ ์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
- `break`: ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

 

 

 ์‹คํ–‰ ํ™”๋ฉด

์ €๋Š” IP WebCam ์–ดํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ WebCam์„ ์ด์šฉํ•œ ์‹คํ–‰ ํ™”๋ฉด์ด๋ž‘ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IP WebCam ์–ดํ”Œ์„ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด ์–ดํ”Œ์„ ๋จผ์ € ์‹คํ–‰ ํ›„, ์ฝ”๋“œ๋ฅผ Run ํ•ด์ฃผ์„ธ์š”.

 

์˜ค๋ฅธ์†
์˜ค๋ฅธ์†
์™ผ์†
์™ผ์†

์˜ค๋ฅธ์†, ์™ผ์† ์ฅ์—ˆ๋‹ค ํˆ๋‹ค ํ•ด๋ณด๋ฉด์„œ ์ •์ƒ์ ์œผ๋กœ ์†์ด ์ž˜ ์ธ์‹๋˜๋Š” ์žฅ๋ฉด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

728x90
๋ฐ˜์‘ํ˜•