이번시간에는 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에서 제공해 주는 것이니 천천히 직접 만들어보시면 아주 간단했었다는것을 알수 있습니다. 추가 질문은 리플이나 이메일로 해주시구요 아래는 프로젝트를 포함한 전체소스코드 파일입니다.

Gesture.zip
