'Recognition'에 해당되는 글 2건

  1. 2009/05/31 Handwriting Recognition Using WPF & TabletSDK (7)
  2. 2008/12/23 Gesture Recognition Using InkCanvas (1)
WPF2009/05/31 13:28

이번시간에는 Tablet SDK와 WPF의 Ink Canvas를 이용하여 간단하게 필기를 인식기를 구현하는 방법에 대해 알아보겠습니다.
기본적으로 Ink Canvas에는 제스쳐와 관련된 인식기가 내장되어 있지만, 필기인식과 관련된 인식기는 포함되어 있지않기 때문에 InkCanvas와 TabletSDK를 함께 사용하여 구현 해보았습니다. 아래는 시연 동영상입니다.



원래 글씨가 초딩글씨인데 마우스로 쓰려고 하니 삐뚤삐뚤 난리도 아니네요.. ㅎㅎ


사용자의 필기 내용을 기록하기 위해 WPF의 InkCanvas를 사용하고 인식을 위해 TabletSDK의 Recognizer를 사용합니다. 이번 샘플에서 사용한 InkCanvas의 소스는 아래와 같습니다.. 소스코드를 보면서 설명하도록 하겠습니다. (설명은 주석에..)

위코드에서는 간단하게 기본 인식기만을 사용하여 인식하기 때문에 인식률이 다소 떨어 질 수 있습니다. 이럴 경우 Recognizers로부터 원하는 RecognizerContext를 얻어 사용하거나 RecognizerContext의 옵션을 변경하여 보다 상황에 맞는 인식기로 변경하실 수 있습니다.

전체 소스코드와 샘플 코드가 포함된 프로젝트 파일입니다. 기타 질문이나 문의는 이메일 또는 리플을 남겨주세요 ^^




저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
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 곡스