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

좋은 웹페이지 즐겨찾기