Leap Motion 프레임 데이터 가 져 오기 프레임 데이터 가 져 오기

Leap Motion 번역 시리즈 글http://52coding.com/leap-motion-official-doc-translation
프레임 데이터 가 져 오기 프레임 데이터 가 져 오기
 Leap Motion 의 API 는 프레임 대상 이 라 고 불 리 는 일련의 스냅 샷 운동 추적 데 이 터 를 제공 합 니 다.데 이 터 를 추적 하 는 모든 프레임 은 도량형 위치 와 스냅 샷 에서 검 측 된 실체 에 대한 정 보 를 포함한다.이 글 은 Leap Motion 컨트롤 러 에서 프레임 물체 (Frame objects) 를 캡 처 하 는 것 에 대해 상세히 논의 하고 있다.
개술
연 결 된 컨트롤 러 에서 추적 정 보 를 포함 하 는 대상 을 가 져 옵 니 다.언제든지 응용 프로그램 이 컨트롤 러 (Controller) 클래스 의 frame () 방법 으로 조작 하려 고 준비 하면 프레임 대상 을 얻 을 수 있 습 니 다.
if( controller.isConnected()) //controller is a Controller object
{
	Frame frame = controller.frame(); //The latest frame
	Frame previous = controller.frame(1); //The previous frame
}

frame () 방법 은 과거 기록 (history) 매개 변 수 를 입력 하면 이전 프레임 을 다시 얻 을 수 있 습 니 다.[캐 시 공간 크기 겠 지] 보통 과거 60 프레임 의 내용 은 이 역사 캐 시 에 저장 되 어 있 습 니 다.
폴 링 을 통 해 프레임 가 져 오기
컨트롤 러 물체 에 대한 폴 링 을 통 해 프레임 대상 을 얻 는 방식 은 자연 프레임 율 에서 운행 하 는 가장 간단 하고 가장 좋 은 전략 이다.장치 가 한 프레임 의 데 이 터 를 처리 할 때 컨트롤 러 의 frame () 함수 만 호출 하면 됩 니 다.
그러나 폴 링 방법 을 사용 하면 같은 줄 에서 같은 프레임 의 내용 을 얻 거나 한 프레임 을 뛰 어 넘 을 확률 이 있 습 니 다.대부분의 경우 잃 어 버 리 거나 중복 되 는 프레임 대상 은 중요 하지 않다.예 를 들 어 만약 에 화면 앞에서 손 으로 물 체 를 이동한다 면 물체 의 운동 은 여전히 매끈매끈 하 다.[무슨 뜻 인지 모 르 겠 지만 데이터 가 부 드 럽 게 변 하면 될 것 같 아 요.]
처 리 된 프레임 대상 을 처리 하고 있 는 지 확인 하기 위해 마지막 으로 처 리 된 프레임 의 ID 수 치 를 현재 프레임 과 비교 합 니 다.
int64_t lastFrameID = 0;

void processFrame( Leap::Frame frame )
{
	if( frame.id() == lastFrameID ) return;
	//...
	lastFrameID = frame.id();
}

만약 에 응용 프로그램 이 프레임 을 잃 어 버 렸 다 면 frame () 함수 의 역사적 인 파 라 메 터 를 사용 하여 잃 어 버 린 프레임 에 접근 할 수 있 습 니 다 (이 프레임 대상 이 역사 캐 시 에 있 는 한).
int64_t lastProcessedFrameID = 0;

void nextFrame( Leap::Controller controller )
{
	int64_t currentID = controller.frame().id();
	for( int history = 0; history < currentID - lastProcessedFrameID; history++)
	{
		processFrame( controller.frame(history) );
	}
	lastProcessedFrameID = currentID;
}

void processNextFrame( Leap::Frame frame )
{
	if( frame.isValid() )
	{
		//...
	}
}

리 셋 함수 로 프레임 가 져 오기
마찬가지 로 Leap Motion 컨트롤 러 의 프레임 대상 을 감청 (Listener) 대상 으로 가 져 올 수 있 습 니 다.새로운 프레임 이 오 면 이 컨트롤 러 대상 은 감청 자의 onFrame () 함 수 를 호출 합 니 다.onFrame 처리 에서 컨트롤 러 (Controller) 의 frame () 함 수 를 호출 하여 자신의 프레임 (Frame) 대상 을 가 져 올 수 있 습 니 다.
 
감청 자의 반전 함 수 를 사용 하 는 것 은 비교적 복잡 하 다. 왜냐하면 반전 은 다 중 스 레 드 이기 때문이다.모든 반전 은 하나의 독립 된 스 레 드 에서 나온다.다 중 스 레 드 에서 온 데 이 터 는 모두 스 레 드 안전 방식 으로 얻 을 수 있다 는 것 을 보증 해 야 한다.
다음 예 는 새로운 데이터 프레임 을 가 져 올 수 있 는 최소 감청 서브 클래스 를 정의 합 니 다.
class FrameListener : Leap::Listener
{
	void onFrame(Controller &controller)
	{
		Frame frame = controller.frame(); //The latest frame
		Frame previous = controller.frame(1); //The previous frame
		//...
	}
};

보시 다시 피 감청 대상 을 통 해 추적 데 이 터 를 얻 는 것 과 폴 링 모드 는 거의 같다.
감청 반전 함 수 를 사용 하 더 라 도 한 프레임 을 뛰 어 넘 는 것 이 필요 합 니 다.만약 당신 의 onFrame 리 셋 함수 가 너무 많은 시간 을 써 서 실행 되 었 다 면, 다음 프레임 은 역사 기록 에 추가 되 었 지만, onFrame 리 셋 함수 가 뛰 어 넘 었 습 니 다.서로 다른 것 은 만약 에 Leap 소프트웨어 가 한 프레임 의 데 이 터 를 신속하게 처리 하지 못 하면 그 프레임 은 버 려 지고 역사 에 들 어가 지 않 을 것 이다.컴퓨터 가 너무 많은 임 무 를 수행 해 야 하기 때문에 정 체 될 때 이 문 제 를 초래 할 수 있다.
프레임 에서 데이터 가 져 오기
프레임 류 는 프레임 에 있 는 데 이 터 를 어떻게 접근 하 는 지 정의 합 니 다.예 를 들 어 다음 코드 는 Leap Motion 시스템 이 추적 한 기본 대상 을 어떻게 가 져 오 는 지 설명 한다.
Leap::Controller controller = Leap::Controller();
// wait until Controller.isConnected() evaluates to true
//...
Leap::Frame frame = controller.frame();
Leap::HandList hands = frame.hands();
Leap::PointableList pointables = frame.pointables();
Leap::FingerList fingers = frame.fingers();
Leap::ToolList tools = frame.tools();

 
프레임 대상 에서 돌아 오 는 이 대상 은 모두 읽 기만 한다.너 는 그것들 을 안전하게 보존 하고 미래 에 사용 할 수 있다.그것들 은 라인 이 안전 하 다.내부 적 으로 이 대상 들 은 C + Boost 라 이브 러 리 공유 포인터 류 를 사용 합 니 다.
IDs 를 사용 하여 프레임 간 의 실 체 를 추적 합 니 다.
만약 서로 다른 프레임 아래 실체 에서 온 ID 를 얻 었 다 면 대상 이 현재 프레임 에 있 는 설명 정 보 를 얻 을 수 있 습 니 다.ID 를 적당 한 유형의 프레임 함수 에 전달 하기:
Hand hand = frame.hand(handID);
Pointable pointable = frame.pointable(pointableID);
Finger finger = frame.finger(fingerID);
Tool tool = frame.tool(toolID);

같은 ID 를 가 진 대상 을 찾 을 수 없다 면 - 한 손 이나 손가락 이 Leap 의 시 야 를 옮 겼 을 수도 있 습 니 다.대신 특별한 무효 대상 으로 돌아간다.무효 대상 도 클래스 의 인 스 턴 스 이지 만 모든 구성원 은 0 수치, 0 배열 또는 다른 무효 대상 을 되 돌려 줍 니 다.이 기술 은 방법 을 한데 연결 하여 호출 하 는 것 을 더욱 편리 하 게 한다.예 를 들 어 다음 코드 는 다 프레임 아래 손 끝의 평균 위 치 를 계산한다.
int count = 0;
Leap::Vector average = Leap::Vector();
Leap::Finger fingerToAverage = frame.fingers()[0];
for( int i = 0; i < 10; i++ )
{
	Leap::Finger fingerFromFrame = controller.frame(i).finger(fingerToAverage.id());
	if( fingerFromFrame.isValid() )
	{
		average += fingerFromFrame.tipPosition();
		count++;
	}
}
average /= count;

잘못된 대상 이 없다 면 이 코드 는 손가락 대상 으로 돌아 갈 때마다 이 프레임 대상 을 검사 해 야 합 니 다.
 
더 많은 관련 내용, 방문 하 세 요.http://52coding.com/category/leap-motion

좋은 웹페이지 즐겨찾기