最近项目中需要用到一个手写键盘,我们使用了WPF的InkCanvas+InkAnalyer来开发。
按照文档,一般的代码写法如下:
var analyzer = new InkAnalyzer();
analyzer.AddStrokes(strokes, Constants.ChsLanguageId);
analyzer.SetStrokesType(strokes, StrokeType.Writing);
var status = analyzer.Analyze();
if (status.Successful)
{
return analyzer.GetAlternates()
.OfType<AnalysisAlternate>()
.Select(x => x.RecognizedString)
.ToArray();
}
analyzer.Dispose();
不过,在实际跑起来之后,却发现识别精确度很低,经常会把一个字识别成好几个字,如果写的稍微远一点,则错误更多。
一个简单的人字会被识别成两个笔画
一个稍微写的开点的游字识别成了三个字
这让我们非常苦恼,在网上查阅资料也没有相关的方案。
经过我们仔细尝试后发现,如果我们把一个字连起来写一气呵成,识别率倒是上去了不少:
但是,我们不可能要求用户所有字都一气呵成吧?
就在这时,我们想到,既然不能要求用户把字一气呵成的写完,能不能通过程序让用户写的笔画“一气呵成”呢?
有了这个灵感,简单改动,将代码改成如下的写法:
/// <summary>
/// 识别
/// </summary>
/// <param name="strokes">笔迹集合</param>
/// <returns>候选词数组</returns>
public string[] Recognize(StrokeCollection strokes)
{
if (strokes == null || strokes.Count == 0)
return Constants.EmptyAlternates;
var stroke = GetCombinedStore(strokes);
var analyzer = new InkAnalyzer();
analyzer.AddStroke(stroke, Constants.ChsLanguageId);
analyzer.SetStrokeType(stroke, StrokeType.Writing);
var status = analyzer.Analyze();
if (status.Successful)
{
return analyzer.GetAlternates()
.OfType<AnalysisAlternate>()
.Select(x => x.RecognizedString)
.ToArray();
}
analyzer.Dispose();
return Constants.EmptyAlternates;
}
private static Stroke GetCombinedStore(StrokeCollection strokes)
{
var points = new StylusPointCollection();
foreach (var stroke in strokes)
{
points.Add(stroke.StylusPoints);
}
return new Stroke(points);
}
注意,在这种写法里面,我们并不直接使用InkCanvas给出的StrokeCollection,而是重新创建了一个Stroke,这个Stroke的StylusPoints是把所有Stroke的StylusPoints都添加进去了,多个Stroke变成了一个Stroke,这下我们再试试:
终于达到我们的要求了,呵呵
希望能给大家带来帮助
【附】如何启用手写识别:
1、在控制面板中选择 程序和功能->添加/删除Windows组件,选择TabletPC组件功能。
2、引用IACore.dll,IALoader.dll,IAWinFX.dll,Microsoft.Ink.Analysis.dll
3、App.config里面需要设置:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/> </startup> </configuration>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>