Location | Tag | Media  ||  A | P

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

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


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


[code]
using System.IO;        // MemoryStream을 사용하기 위해서  
using Microsoft.Ink;    // Tablet SDK의 Ink  
 
// WPF의 DrawingAttributes와 TabletSDK의 DrawingAttributes가 겹치기 때문에  
// DrawingAttributes를 WPF의 DrawingAttributes로 지정  
using DrawingAttributes = System.Windows.Ink.DrawingAttributes;  
 
 
public class HandwritingRecognition : InkCanvas // WPF InkCanvas를 상속받아 구현  
{  
 
    // 필기 인식에 사용되는 RecognizerContext  
    public RecognizerContext RecognizerContext { get; set; }  
 
 
    public HandwritingRecognition()  
    {  
        // Step #1. 사용가능한 Recongizer들을 가져온다.  
        Recognizers Recognizers = new Recognizers();  
 
        // Step #2. 시스템에서 사용하는 기본 Recognizer를 가져온다.  
        Recognizer Recognizer = Recognizers.GetDefaultRecognizer();  
 
        // Step #3. Recognizer로부터 사용가능한 RecognizerContext를 생성한다.  
        RecognizerContext = Recognizer.CreateRecognizerContext();  
 
        // InkCanvas에서 사용할 DrawingAttributes를 설정한다.  
        // 인식 성능과는 무관  
        DefaultDrawingAttributes = new DrawingAttributes()   
                                   { Color = Colors.White, Width = 5, Height = 5 };  
    }  
 
 
    public RecognitionResult Recognize()  
    {  
        // Step #1. InkCanvas에 저장된 Stroke가 없으면 Null을 리턴  
        if (Strokes.Count == 0) return null;  
 
        // Step #2. StrokesStrem에 InkCanvas의 Stroke들을 저장  
        MemoryStream StrokesStrem = new MemoryStream();  
        Strokes.Save(StrokesStrem);  
 
        // Step #3. InkCanvas의 Stroke들을 삭제  
        Strokes.Clear();  
 
        // Step #4. TabletSDK에서 제공하는 Ink를 사용하여  
        // RecognizerContext에서 사용가능한 Stroke형태로 변환  
        Ink ink = new Ink();  
        ink.Load(StrokesStrem.ToArray());  
        RecognizerContext.Strokes = ink.Strokes;  
 
        // Step #5. 인식  
        RecognitionStatus State;  
        return  RecognizerContext.Recognize(out State);  
    }  

[/code]

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

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

Posted by Bestend
: