티스토리 뷰

반응형

WWDC 2020 세션 중, Detect Body and Hand Pose with Vision 을 인상깊게 봤는데

일단 손동작을 detect하는 것을 따라해보겠습니다. 

 

엄지와 검지를 붙인채로 텍스트를 쓰는 것을 보여줬는데요..!

 

 

너무 너무 멋있어서 설레는 마음으로 예제 프로젝트를 돌려서 해봤는데ㅠㅠ

절대 저렇게 안되더라구요...(속은 기분..)

 

저거 빼고 손동작이랑 똑같은 이모지 보여주는 것이랑 

 

 

특정 손동작으로 사진 촬영 같은 UI Control 하는 것 따라해보겠습니다..!! 

 

 

위의 두개는 예제프로젝트로 공개 안해줬는데, 과연 잘될까요..?.?

 

 

[1] AVCaptureSession과 AVCaptureViedoPreviewLayer 설정해주기

 

우선 info.plist에 카메라 접근 권한 요청을 추가해주고 

 

 

AVCaptureSession을 설정해주세요

input은 전면카메라, output은 VideoData로 설정해주고

previewLayer도 만들어서 화면에 붙여줄게요 (이거 해야지 카메라가 보입니다)

 

 

여기까지하면 이렇게 접근권한요청 얼럿이 나오고 확인을 누르면 전면 카메라가 보입니다.
(허용안하는 케이스는 대응하지 않겠습니다)

 

 

[2] AVCaptureVideoDataOutputSampleBufferDelegate 설정

이따가 AVCaptureVideoDataOutputSampleBufferDelegate 안에 있는 captureOutput(_:didOutput:from:) 에서 작업해줄 것인데요,,,!!

 

output에 AVCaptureVideoDataOutputSampleBufferDelegate를 세팅해주고

 

 

저 delegate를 채택해주겠습니다.

 

 

이제 사전 세팅이 끝났습니다.

 

[3] VNDetectHumanHandPoseRequest 준비하기

 

Vision framework를 import하고 

hand pose request를 만들어줍니다. 

 

maximumHandCount는 디폴트값이 2인데요, 1로 설정해주겠습니다-!! 

(손 하나만 detect하겠다는 뜻이에요!)

 

 

[4] VNImageRequestHandler 만들기

VNImageRequestHandler는 이미지로부터 얼굴정보나 텍스트를 찾는 등 이미지 분석을 처리해주는 친구인데요,

이니셜라이저 중 3개 정도만 가져와봤습니다.

 

 

iOS 14에 이 두가지 이니셜라이저가 추가되었더라구요...!! 

저희는 카메라를 실시간 detecting하니까 이 이니셜라이저를 써주겠습니다.

 

 

(아마 사진을 불러와서 손 동작 정보를 알고 싶으면 ciimage 넣는 이니셜라이저 쓰면 될 것 같아요) 

 

이렇게 만들어주세요-!!

(orientation은 애플 샘플 프로젝트에서 up이라고 해서 저도 따라 했어요)

 

 

[5] VNImageRequestHandler에게 handpose request를 실행하라고 하기

 

아래 함수를 이용하여 handler에게 아까 만든 hand pose request를 perform 하라고 해줍니다.

 

 

[6] VNRecognizedPointsObservation에서 손가락 포인트 정보들 받기

 

저렇게 request를 수행하면 

VNRecognizedPointsObservation이 리턴된다고 합니다. 

observation은 손의 모든 landmark들을 담고 있다고 합니다. (landmark는 밑에서 설명할게요)

 

저희는 손가락 하나만 detect하겠다고 했으니까 results의 첫번째 값만 가져오면 됩니다.

 

 

그리고 observation에서 원하는 손가락의 포인트들을 가져오면 됩니다.

(엄지 손가락 포인트들 가져오게 해볼게요)

 

 

그리고 돌려서 손가락 움직여보면 이렇게 VNRecognizedPoint들이나옵니다. 

 

 

[7] 배경 지식(1) - LandMark 란 무엇인가

 

손의 주황점들을 hand landmark라고 합니다.

손가락에 각각 4개씩,

손목쪽에 하나해서

21개의 land mark가 있습니다. 

 

land mark를 얻어내려면 키값을 알아야하는데요

 

 

1) 어느 손가락인 지에 대한 키값 (Regin Key)

 

위에서 부터 순서대로 엄지~새끼 손가락 입니다. 

 

 

2) 손가락에서 어느 포인트냐에 대한 키값 (LandMarkkey)

 

색깔별로 저 포인트를 부르는 이름을 봐주세요 (TIP, DIP, PIP, MCP)

키값은 handLanmarkKey + (Index 또는 middle 또는 ring 또는 little) + (TIP, DIP, PIP, MCP)

이렇게 되겠습니다. 

 

 

엄지 손가락만 저 포인트를 부르는 이름이 다르다고 합니다. 

 

 

그리고 손목쪽에 있는 land mark는 저런 키값으로 가져올 수 있습니다.

 

 

3) 실습

 

손의 모든 랜드마크를 가져오려면 이렇게 

 

 

엄지 손가락의 TIP 랜드마크를 가져오려면 이렇게 

 

 

[7] 배경 지식 (2) - 그럼 LandMark 는 어떻게 표현되나요?

 

landMark는 VNRecognizedPoint 로 표현됩니다.

위의 실습에서 thumbTIPPoint의 타입이 VNRecognizedPoint 였죠?!

 

VNRecognizedPoint는 VNDetectedPoint 의 서브클래스이고,

VNDetectedPoint 는 VNPoint 의 서브 클래스 입니다. 

 

 

참고로 confidence는 detect 정확도를 나타내는 값이라고 합니다. 

 

 

 

여기까지 한 전체 코드 입니다.

 

 

 

Reference

developer.apple.com/videos/play/wwdc2020/10653/

 

Detect Body and Hand Pose with Vision - WWDC 2020 - Videos - Apple Developer

Explore how the Vision framework can help your app detect body and hand poses in photos and video. With pose detection, your app can...

developer.apple.com

 

반응형
댓글