'Gesture'에 해당되는 글 2건

  1. 2008/12/27 Gesture Recognition Using PointCollection (2)
  2. 2008/12/23 Gesture Recognition Using InkCanvas (1)
WPF2008/12/27 08:14

지난시간에 Ink Canvas를 사용한 Gesture Recognition방법에 대해서 소개해 드린바 있습니다. 간단히 Mouse나 Stylus Pen을 이용한 Gesture Recognition에는 무리 없이 사용가능한 방법이지만, Mouse나 Stylus를 사용하지 않고는 제스쳐를 인식할 수 있는 방법이 없어서  현재 개발중인 MultiTouch 기반의 System에서는 적용이 힘들다는 결론을 내렸습니다.

뭐 OneTouch였다면 눌렀을때 MouseEvent를 발생시켜서 구현은 가능하겠지만.. 다중사용자를 고려해야하다보니 어쩔 수 없이 다른 방법을 찾아야 했죠.. 한참을 찾다보니 WPF 에서는 친절하게도 GestureRecognizer라는 녀석을 제공해주고있다는 사실을 알았습니다.

GestureRecognizer는 Application Gesture의 전체 또는 하위 집합을 인식하도록 하기 위해 구현된 Class로서 파라미터로 StrokeCollection를 입력하면 해당 하는 제스쳐의 결과를 반환 해주는 역할을 합니다. 마우스가 다녀간 포인트 좌표만 가지고도 사용자가 취한 Gesture가 무엇인지 알아 낼수 있다는 말이죠,

나머지는 코드를 보고 설명하도록 하겠습니다.



일단 GestureRecognizer를 사용하기 위해서는 StrokeCollection이 필요합니다. StrokeCollection을 만들기 위해서는 Stroke가 필요하고.. Stroke를 만들기 위해서는 StylusPointCollection이 필요하고..StylusPointCollection을 만들기 위해서는 StylusPointDescription가 필요하죠, 마지막으로 StylusPointDescription를 만들기 위해서는 StylusPointPropertyInfos가 필요한데... (엄청나게 복잡해보입니다만 거꾸러 타고 올라가다보면 결국에 중요한건 몇개 안되네요..) 어쨋든 이부분이 맨 윗줄 멤버변수를 선언한 부분과 생성자 부분이 이에 해당합니다.

그리고 public ApplicationGesture Recognize(StrokeCollection Strokes) 를 보시면 전시간에 소개해 드렸었던 방식과 매우 비슷하게 동작하는것을 확인 하실 수 있습니다.  이를 활용해서 아래쪽에 StylusPointCollection를 사용하는 Recognize함수와 처음 목표로 했었던 IEnumerable<Point>를 사용하는 Recognizer함수를 구현 했습니다. (짝짝짝)

그리고 사용하실때는 아래와 같이 사용하실 수 있습니다.

 

이제 MultiTouch에 적용하기 위해서 각 Point만다 Handler를 생성해주고 Point가 사라짐과 동시에 인식하도록 구현하면 MultiTouch에 적용할 수 있는 Gesture 인식기가 완성되네요 ^^ 질문은 리플이나 메일 주세요 +_+ 그럼 이만 저는 꿈나라로 무브무브~

아래는 프로젝트 파일을 포함한 전체 소스코드입니다.


MSDN에 각 ApplicationGesutre에 해당하는 동작을 적용 사례와 함께 그림으로 잘 풀어서 설명해놓았네요.
아래 URL을 참고 해주세요^^

MSDN : http://msdn.microsoft.com/ko-kr/library/ms697513(en-us).aspx

 

 

 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2008/12/23 23:08

이번시간에는 Ink Canvas를 사용하여 간단하게 Gesture Recognition을 구현 하는 방법에 대해서 소개해 드리겠습니다. 멤버십에서 Virtual Surface System을 개발하는중이였는데 거기에 포함될 Gesutre Recognition 기능의 일부입니다.
아래는 구현 결과 동영상입니다. 마우스로 빠르게 움직였더니 끊김이 느껴지네요 ㅜ_ㅜ ㅋ


제스쳐 인식이라고 하면 대부분 먼저 떠오르는게 유전자 알고리즘이다 뭐다 해서 상당히 귀찮은 내용의 작업이 많이 필요했었는데 WPF의 Ink Canvas를 사용하면 아주 간단하게 구현할 수있습니다. (간단하게 구현 한다기 보다는 이미 구현된것을 활용한다는 표현이 더 맞겟네요ㅎ)

아래는 코드입니다. InkCanvas를 상속받아 GestureInkCanvas를 만들어 보았습니다.

public class GestureInkCanvas : InkCanvas
{
    
    public ObservableCollection EnabledGestures { get; private set; }
    public RecognitionConfidence RecognitionConfidence { get; set; }

    public delegate void RecognitionGestureHandler(ApplicationGesture Gesture);
    public event RecognitionGestureHandler RecognitionGesture;

    public ApplicationGesture LastGesture
    {
        get { return (ApplicationGesture)GetValue(LastGestureProperty); }
        set { SetValue(LastGestureProperty, value); }
    }

    public static readonly DependencyProperty LastGestureProperty =
        DependencyProperty.Register("LastGesture", typeof(ApplicationGesture), 
        typeof(GestureInkCanvas), new UIPropertyMetadata(ApplicationGesture.NoGesture));


    public GestureInkCanvas()
    {

        EditingMode = InkCanvasEditingMode.GestureOnly;
        Gesture += new InkCanvasGestureEventHandler(GestureInkCanvas_Gesture);
        EnabledGestures = new ObservableCollection();
        EnabledGestures.CollectionChanged +=
            delegate(object sender, NotifyCollectionChangedEventArgs e)
            {SetEnabledGestures(EnabledGestures);};

        EnabledGestures.Add(ApplicationGesture.AllGestures);
    }


    void GestureInkCanvas_Gesture(object sender, InkCanvasGestureEventArgs e)
    {
        GestureRecognitionResult Result = e.GetGestureRecognitionResults()[0];
        if(Result.RecognitionConfidence > RecognitionConfidence) return;
        if (Result.ApplicationGesture != ApplicationGesture.NoGesture && 
            RecognitionGesture != null)
            RecognitionGesture(Result.ApplicationGesture);
        
        LastGesture = Result.ApplicationGesture;
    }

}



Gesutre를 사용하기 위해서 InkCanvas의 EditingMode Property를 GestureOnly로 설정합니다. (Ink와 Gesture를 동시에 사용하고자 한다면 InkAndGesture로 설정하시면 됩니다.) 그리고 SetEnabledGestures를 통해서 사용하고자 하는 ApplicationGesture를 등록합니다.

마지막으로 RecognitionConfidence를 통해서 제스쳐를 인식 결과에 대한 신뢰 수준을 정할 수 있습니다. Strong, Intermediate, Poor을 중 하나를 선택할 수 있습니다. Strong이 가장 신뢰할 수 있으며 Poor이 가장 신뢰할 수 없는 결과를 제공합니다. (개인적으로 Strong은 너무 빡빡하게 걸러내서... -_- Intermediate를 주로 사용합니다..)

관리를 쉽게 하기 위해서 이것저것 코드를 더 추가해서 조금 복잡해 보일 수 있지만 실질적인 코드는 모두 InkCanvas에서 제공해 주는 것이니 천천히 직접 만들어보시면 아주 간단했었다는것을 알수 있습니다. 추가 질문은 리플이나 이메일로 해주시구요 아래는 프로젝트를 포함한 전체소스코드 파일입니다.  



 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스