Kinect 개발 파워 포인트 재생 조수
선언:
앞서 자세 (pose) 인식 에 관 한 박문 을 쓴 뒤 몇 가지 자 세 를 정의 해 체감 러시아 블록 을 만 들 었 다.자세 인식 은 관절 점 과 관절 점 간 의 상대 적 위치 관 계 를 통 해 판단 한다.판단 이 성립 되면 지 정 된 명령 을 집행 한다.그러면 우 리 는 자 세 를 지정 하여 우리 의 어 지 러 운 생각 을 실현 할 수 있 습 니 다 ~ ~ PPT 재생 조수 가 생 겨 났 습 니 다.
기본 사고방식:
Kinect 가 있 으 면 우 리 는 제스처 (손 자세) 를 사용 하여 슬라이드 의 재생 을 제어 할 수 있 습 니 다. 강연 을 하면 서 키 보드 를 누 르 거나 손 에 ppt 컨트롤 러 를 들 필요 가 없습니다. 우리 가 해 야 할 일 은 두 손 으로 머리 를 잡 고 상영 하 는 것 입 니 다. 가볍게 왼쪽으로 또는 오른쪽으로 손 을 흔 들 면 슬라이드 가 앞으로 또는 뒤로 한 페이지 를 넘 기 는 것 을 제어 할 수 있 습 니 다.두 손 을 들 면 화면 이 검 게 변 한다.멋 있 지?강연 할 때 이 동작 을 하 는 것 이 좀 이상 할 수도 있 지만 슬라이드 상영 을 통제 하 는 좋 은 방법 이기 도 하 다.
Kinect 제어 슬라이드 재생 을 실현 하 는 것 은 매우 간단 하 다. 주요 한 사 고 는 Kinect 를 사용 하여 인체 의 동작 을 포착 한 다음 에 식 별 된 동작 에 따라 시스템 에 클릭 하여 앞으로, 뒤로, "F5", "B" 버튼 의 사건 을 보 내 슬라이드 를 전환 하고 상영 하 며 검 게 만 드 는 것 이다.여기 서 핵심 기능 은 제스처 의 식별 에 있다. 우 리 는 개발 하기 전에 어떤 제스처 가 앞으로 또는 뒤로 슬라이드 를 전환 하 는 지 정의 해 야 한다.
대응 관계:
자세.
대응 버튼
트리거 액 션
두 손 으로 머리 를 껴안다
F5
상영 하 다
왼쪽으로 왼손 을 흔들다
left
이전 페이지
오른손 을 오른쪽으로 흔들다
right
다음 페이지
두 손 으로 들다
B
까 매 지다
코드 구현
이전 몇 편의 박문 은 Kinect 의 각종 데 이 터 를 가 져 오 는 코드 를 썼 기 때문에 관건 적 인 부분의 코드 를 토론 합 니 다.
자세 통제 이기 때문에 자 연 스 럽 게 정확도 문제 가 존재 하기 때문에 우 리 는 몇 가지 한도 값 을 정의 하여 판단 근거 로 삼 아야 한다.
///
///
///
private const double ArmStretchedThreshold = 0.45;
///
///
///
private const double ArmRaisedThreshold = 0.20;
///
///
///
private const double DistanceThreshold = 0.05;
ppt 재생 제어 명령 에 서 는 양손 거리 가 머리 0.05 보다 작 으 면 사용자 가 키보드 의 F5 키 를 클릭 하려 고 한다 고 생각 하고, 오른손 관절 점 이 x 축 에 있 는 거리 가 머리 관절 점 보다 0.45 이상 이면 키보드 의 right 버튼 을 클릭 하려 고 한다 고 설정 합 니 다.만약 에 머리 관절 점 의 위치 가 x 축 방향 이 왼손 관절 점 보다 x 축 에 있 는 위치 가 0.45 이상 이면 사용자 가 키보드 의 left 단 추 를 누 르 려 고 한다 고 생각 합 니 다.만약 에 두 손 이 머리 높이 0.20 을 초과 하면 사용자 가 키보드 의 B 키 를 클릭 하려 고 한다 고 생각 합 니 다. 0.05, 0.45 와 0.20 이라는 몇 가지 한도 값 은 반복 적 인 테스트 를 통 해 나 온 것 입 니 다 (맞습니다. Dubug 가 아 닌 Test 입 니 다).그래서 테스트 가 중요 하 다.
키 코드 는 다음 과 같 습 니 다:
///
///
///
///
///
///
private void ProcessForwardBackGesture(Joint head, Joint rightHand, Joint leftHand)
{
// , PPT
if (rightHand.Position.X > head.Position.X + ArmStretchedThreshold)
{
if (!isForwardGestureActive)
{
// forward ,
isForwardGestureActive = true;
// “ ”
System.Windows.Forms.SendKeys.SendWait("{Right}");
}
}
else
{
isForwardGestureActive = false;
}
// , PPT
if (leftHand.Position.X < head.Position.X - ArmStretchedThreshold)
{
if (!isBackGestureActive)
{
// back ,
isBackGestureActive = true;
// “ ”
System.Windows.Forms.SendKeys.SendWait("{Left}");
}
}
else
{
isBackGestureActive = false;
}
// , PPT
if ((leftHand.Position.Y > head.Position.Y - ArmRaisedThreshold) && (rightHand.Position.Y > head.Position.Y - ArmRaisedThreshold))
{
if (!isBlackScreenActive)
{
isBlackScreenActive = true;
System.Windows.Forms.SendKeys.SendWait("{B}");
}
}
else
{
isBlackScreenActive = false;
}
// , PPT
if (Math.Abs(head.Position.Y - rightHand.Position.Y) < DistanceThreshold && (Math.Abs(head.Position.Y - leftHand.Position.Y) < DistanceThreshold && !isForwardGestureActive &&!isBackGestureActive))
{
if (!isPresent)
{
isPresent = true;
System.Windows.Forms.SendKeys.SendWait("{F5}");
}
}
else
{
isPresent = false;
}
}
위의 코드 에서 사용자 가 오른쪽으로 손 을 흔 드 는 동작 을 판단 하면 System. Windows. Forms. SendKeys. SendWait ("{Right}") 문 구 를 실행 하여 키 보드 를 오른쪽으로 누 르 십시오.이 방법 을 실행 할 때 파워 포인트 프로그램 이 현재 활동 상태 에 있어 야 PPT 가 오른쪽 키보드 로 이 벤트 를 클릭 할 수 있 습 니 다.주의해 야 할 것 은 isBackGestureActive, isForward GestureActive, isBlackScreenActive 와 isPresent 라 는 네 개의 불 모양 의 플래그 비트 입 니 다. 사용자 가 특정한 동작 에 있 을 때 System. Windows. Forms. SendKeys. SendWait ("{xx}") 를 계속 보 내 는 것 을 방지 할 수 있 습 니 다.
위의 방법 은 sensorSkeleton Frame Ready 이벤트 에서 먼저 머리, 왼손, 오른손 관절 점 데 이 터 를 얻 은 다음 이 방법 을 사용 합 니 다.
///
///
///
///
///
void sensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
using (var skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame == null)
return;
if (skeletons == null ||
skeletons.Length != skeletonFrame.SkeletonArrayLength)
{
skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
}
skeletonFrame.CopySkeletonDataTo(skeletons);
}
Skeleton closestSkeleton = skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked)
.OrderBy(s => s.Position.Z * Math.Abs(s.Position.X))
.FirstOrDefault();
if (closestSkeleton == null)
return;
var head = closestSkeleton.Joints[JointType.Head];
var rightHand = closestSkeleton.Joints[JointType.HandRight];
var leftHand = closestSkeleton.Joints[JointType.HandLeft];
if (head.TrackingState == JointTrackingState.NotTracked ||
rightHand.TrackingState == JointTrackingState.NotTracked ||
leftHand.TrackingState == JointTrackingState.NotTracked)
{
//Don't have a good read on the joints so we cannot process gestures
return;
}
//
SetEllipsePosition(ellipseHead, head, false);
SetEllipsePosition(ellipseLeftHand, leftHand, isBackGestureActive);
SetEllipsePosition(ellipseRightHand, rightHand, isForwardGestureActive);
//
ProcessForwardBackGesture(head, rightHand, leftHand);
}
코드 가 GitHub 에 공개 되 었 습 니 다:https://github.com/Marsyangkang/KinectPowerpointControl
Kinect 개발 시리즈 박문:
Kinect 개발 의 Interaction 인 터 랙 션 디자인
http://yacare.iteye.com/blog/1979683
Kinect 개발 의 결합 유 니 티 3D 게임 응용 개발
http://yacare.iteye.com/blog/1950164
Kinect 개발 의 체감 손 들 어 프로 그래 밍 (Kinect 러시아 블록)
http://yacare.iteye.com/blog/1950133
Kinect 개발 의 간단 한 자세 인식
http://yacare.iteye.com/blog/1950112
Kinect 개발 은 골격 관절 데 이 터 를 얻 고 성냥 개비 로 그립 니 다.
http://yacare.iteye.com/blog/1950085
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kinect 개발 파워 포인트 재생 조수앞서 자세 (pose) 인식 에 관 한 박문 을 쓴 뒤 몇 가지 자 세 를 정의 해 체감 러시아 블록 을 만 들 었 다.자세 인식 은 관절 점 과 관절 점 간 의 상대 적 위치 관 계 를 통 해 판단 한다.판단 이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.