본문 바로가기

전생의 기억/영상처리

키넥트 센서를 이용한 핸드트래킹 및 웨어러블 기기에 적용하기

본 글은 유명 논문에 대한 요약 및 정리입니다.


Using Kinect for hand tracking and rendering in wearable haptics - 원본


 웨어러블 기기와 같은 열악한 환경에서의 위치감지는 마이크로 소프트웨어의 키넥트에 있는 깊이 정보 센서와 결합하여 사용할 수 있습니다.


hand 트래킹 기술이 개발되었습니다.

이 기술은 가상현실 상에서 hand 애니메이션 구현을 할수 있게 합니다. 그리고 Force rendering 알고리즘을 구현합니다.

이 Force renderin 알고리즘에서는 Hand tracker에 의해 손가락끝의 위치를 측정하게 되는데, 이 tracker는 kinect에 최적화되어 설계되었습니다. 그리고 알고리즘이 웨어러블 기기 디스플레이와의 접촉력을 계산하게 됩니다. 

이 논문에서는 간단한 실험을 통해서 키넥트와 웨어러블 기기의 결합으로 어떤 효과가 일어나는지 보여줄 것입니다.


소개


[출처 - https://en.wikipedia.org/wiki/Kinect]

키넥트는 마이크로소프트에서 2010년에 새롭게 소개한 게임 컨트롤러 기술입니다.

발표된 이후에는, 키넥트는 마이크로소프트에서 만든 기기가 컴퓨터 게임뿐만 아니라, 로보틱스, 가상현실등 과 같은 다른 어플리케이션에서도 동작하도록 변해간다는 증거가 되었습니다. 키넥트는 목소리와 움직임을 추적하고, 얼굴을 식별 할 수있는 기능 등이 들어가있기에 다른 장치가 추가로 필요하지 않습니다.


1. 목소리, 움직임 트래킹

2. 여러 용도의 어플리케이션에 적용

3. 얼굴인식

4. 적외선 카메라 - depth 영상 추출 가능


Hand Tracking Algorithm

핸드 트래킹 알고리즘

_______________________________________________________________________________________________________________


현재 발표된 핸드트래킹 알고리즘에서는 다음과 같은 4단계에 걸쳐 구현되어 있습니다.

1. depth 영상 추출 및 처리

2. 손의 bounding box 계산하기

3. 손가락 끝지점과 같은 주요 손 영역을 추출

4. filter trajectories.(필터 궤도)


트래킹 알고리즘은 opencv library를 활용한다.

OpenCV에서는 2D와 3D 영상에서 객체인식과 기하학적 처리와 관련된 함수를 안정적이고 많이 지원해주는 라이브러리입니다.

그중 Hand tracking Algorithm을 구현하는데에 필요한 주요 함수가 OpenCV에 제시되어 있습니다.


Step 1. 깊이 영상 처리


먼저, 키넥트의 깊이 맵 정보를 읽어오고, 이를 이용해 3D 장면으로 그레이스케일 이미지를 만듭니다.

이미지 투영(i,j)를 가지는 각각의 포인트에 대해 키넥트 센서에서 읽은 11bit의 깊이 변수는 8비트 깊이 변수로 변환됩니다.

그림 2에서는 깊이 영상에서 손 영역에 대해 bounding box 영역 검출을 보여줍니다.


Step 2. 손의 bounding box 계산

<그림2>


bounding box란, 손 영역에 대한 가장 작은 넓이로 표현할 수 있는 영역에 대해 최소 부피 또는 넓이를 나타내는 box 영역이다.

깊이 영상에서, 손을 포함하고 있는 bounding box 영역을 찾는다. 이때, 키넥트 센서와 가장 가까운 물체(손)라고 가정한다.

이 가정은 사용자가 일반적으로 가상 객체와 상호 작용을 하기때문에 Kinect와 트래킹 할 사용자의 손 사이에 물체가 끼어 있지 않기 때문에 제한이 없습니다.

손의 bounding box 영역을 계산하는것에는 threshold 방법이 사용됩니다.

하한 및 상한 임계 값을 사용하면 , 키넥트 센서로부터 너무 멀거나 가까움에 따라 깊이 정보가 0으로 설정됩니다.

이 논문에서는 경험에 따른 결과로, 손의 거리가 약 70cm정도에서 최적화된 값을 얻을 수 있었습니다.

70cm는 Kinect 센서로 손의 위치에 관한 세부 사항이 많이 손실되지 않는 거리이기 때문에 적절한 값입니다... 뭐 이래...

다음단계에서 우리는 bounding box의 2D이미지 윤곽을 참조 할 것입니다.



Step 3. 2D 이미지의 손 윤곽선에서 손끝 위치까지

 Bounding box에 의해 crop되어진 이미지안에서의 손의 윤곽선은 평가됩니다. 어디에? 뭐로부터?어디가?

OpenCV 안의 객체들의 윤곽선을 찾는데 사용되는 함수는 cvFindContours()입니다.

이 함수는 바이너리 이미지(thresholding된 bounding box 손 이미지) 를 입력으로 받아 검색된 윤곽선의 수를 반환합니다.

바이너리 이미지는 Crop된 이미지로부터 계산됩니다.


윤곽선을 얻은 이후에, OpenCV의 cvConvexHull() 함수를 이용하여 육곽선의 볼록 폐포를 계산하는것이 가능합니다. 


볼록폐포 = 볼록 폐포(convex hull)은 집합으로 주어진 점이나 영역을 포함하는 가장 작은볼록 집합이다. 일반적으로는유클리드 공간에서 정의되지만, 그 이상으로 확장하는 것도 가능하다. 볼록 폐포를 계산하는 것은계산기하학의 연구과제중 하나이다.


convex defects

간단히 말하면, 볼록 결함은 이미지에서 분할 된 물체 (얼룩, 윤곽선)의 공동입니다. 즉, 객체에 속하지 않지만 외부 경계 내부에 위치하는 영역을 의미합니다 (자세한 내용은 cv :: convexHull 함수의 설명서를 참조하십시오).

손가락 사이의 영역 (모두 화살표로 표시)은 볼록 결함입니다.



Hull의 점은 그림 3에서와 같이 손이 열려 있으면 손목에서 손가락까지 손의 외부윤각을 나타냅니다.

<그림 3>

(알고리즘은 볼록 결함의 시작 및 끝 지점에 해당하는 손가락 끝, 특히 색인 및 엄지를 감지합니다)


이 점 집합은 손가락을 식별하는 데 사용되는 함수인 cvConvexityDefects ()에 필요합니다. 

루틴은 윤곽선과 convex hull를 가져 와서 각 convex에 대해 반환하는 손가락 사이의 영역을 계산합니다. Start Point가 손가락 끝에 해당하며, Depth Point와 End Point는 인접한 손가락의 동일한 선상에 해당합니다. End Point는 손가락 사이의 영역이 끝나는 지점입니다. Hull로부터 손가락 사이 영역의 최대 거리 또한 반환됩니다. 그림 3에서는 convex 계산들을 보여줍니다.


이 손가락 사이 영역들은 3차원 공간에서의 손의 위치와 관련된 정보를 제공하게 됩니다.

그리고 특별히 이 영역들 중에서, convex hull과 가까이 있는 손가락 사이의 영역일수록, 손가락 끝의 위치로 결정되게 됩니다.


다른 중요한 지점들은 convex hull의 손의 질량 중심점과 손목의 두 정점이 있습니다.

이 세개의 점들을 이용하면 가상현실에서 reference 프레임과 손바닥의 위치를 파악할 수 있습니다!


Step 4. 필터링(Filtering)


모든 관련 변수들이 이전의 단계에서얻어집니다.  그리고 Kalman filter에 의해 스무딩 됩니다.

여기서 cvCreateKalman() 함수를 사용합니다.(in OpenCV)


필터는 점 위치 p속도 v로 구성된 상태 벡터 s를 추정함.


해당값 측정과 관련된 방정식은 다음과 같습니다.


방정식


조건

Δt 두 반복 사이의 시간 간격(30 분의 1 이상, Kinect 장치의 프레임 속도 30fps 이상)과 w (k)와 v (k)는 동적 및 측정 노이즈를 나타냅니다. 그것들은 서로 독립적이고, 흰색이고, 각각 공분산 Q와 R을 가진 정규 확률 분포로 가정된다. 공분산 행렬과 필터 초기화의 선택에 대한 세부 사항은 [17]에보고되어있다.



_______________________________________________________________________________________________________________
제안된 알고리즘의 한계


제안된 알고리즘의 주요 한계점들에 대해 얘기해보도록 합시다.

해당 트래킹 알고리즘에 영향을 미치는 주된 오류는 두번째 단계와 관련이 있습니다.

핸드 트래커는 경험적 방법을 기반으로 되어있습니다.



경험적 방법(heuristics)

-??


알고리즘이 제대로 동작하는데에 가장 중요한 부분은 손의 가장 큰 부분을 볼 수 있어야한다? 뭔소리

손가락의 식별을 위해서 몇몇 경험적 방법들이 사용되며, 하나 또는 그 이상 또는 전체가 가려질 경우, 식별이 불가능할 수 있습니다. 결함을 생성하는 최악의 조건은 손가락이 Kinect 카메라 평면 xy에 수직일 때 입니다.

이경우에 깊이 정보가 존재하지 않기때문에, 손의 많은 영역에 대해 검색이 불가능합니다.

제안된 알고리즘의 한계


제안된 알고리즘의 주요 한계점들에 대해 얘기해보도록 합시다.

해당 트래킹 알고리즘에 영향을 미치는 주된 오류는 두번째 단계와 관련이 있습니다.

핸드 트래커는 경험적 방법을 기반으로 되어있습니다.



손 애니메이션 및 햅팅 반응


제안된 핸드 트래킹 알고리즘은 [18]에서 논의된 손 아바타의 애니메이션을 허용합니다.

'전생의 기억 > 영상처리' 카테고리의 다른 글

균등분포란?  (0) 2017.09.15
정규분포란?  (0) 2017.09.15
영상의 화질 향상 - 명암비 조절  (0) 2017.02.10
영상의 화질 향상 - 밝기 조절  (0) 2017.02.10
영상의 화질 향상 - 영상반전  (0) 2017.02.09