WPF下System.Windows.Ink的手写识别可否达到工具栏中的tablet pc输入面板中的识别率?

APM60- 2012-06-02 11:46:26
WPF下,用了InkCanvas控件和System.Windows.Ink进行手写识别。识别率还算可以。
但是用了下 任务栏-》工具栏-》tablet pc输入面板 中的手写识别后就不淡定了。
识别率咋就相差这么大呢?系统自带的这个工具咋就这么好使呢?难道调用不是同一个识别库文件吗?都有tablet pc字样啊?


//添加对 WPF 墨迹分析程序集、IAWinFX.dll、IACore.dll 和 IALoader.dll(这些内容可以在 \Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 中找到)的引用。
using System.Windows.Ink;

// Recognizes handwriting by using RecognizerContext
private void buttonClick(object sender, RoutedEventArgs e)
{
InkAnalyzer theInkAnalyzer = new InkAnalyzer();

theInkAnalyzer.AddStrokes(theInkCanvas.Strokes);
theInkAnalyzer.SetStrokesLanguageId(theInkCanvas.Strokes, 0x0804); // 0x0804 简体中文
theInkAnalyzer.SetStrokesType(theInkCanvas.Strokes, StrokeType.Writing);

AnalysisStatus status = theInkAnalyzer.Analyze();

if (status.Successful)
{
//textBox1.Text = theInkAnalyzer.GetRecognizedString();
textBox1.Text = "";
for (int i = 0; i < theInkAnalyzer.GetAlternates().Count; i++)
{
textBox1.Text += theInkAnalyzer.GetAlternates()[i].RecognizedString;
}
}
else
{
MessageBox.Show("识别失败");
}
}


tablet pc输入面板是调用的哪个识别库?可否在WPF程序中调用它?达到tablet pc输入面板那样高的识别率?

如果换种方式在程序中打开tablet pc输入面板窗口的话,
又比较担心用户会通过点击输入窗口的选项或者帮助切换出主程序界面。
...全文
949 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
maddemon 2015-01-10
  • 打赏
  • 举报
回复
引用 9 楼 liu610721 的回复:
看了下MSDN上的那个demo和楼主的一样 MSDN上有这几句“此示例要求在系统上安装手写识别器。” "添加对 WPF 墨迹分析程序集、IAWinFX.dll、IACore.dll 和 IALoader.dll(这些内容可以在 \Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 中找到)的引用。" 我的系统上有没有手写识别器我不清楚(是不是xp自带识别器?反正我没装过) 但是“\Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7”这里面没有IALoader.dll,IAWinFX.dll和IACore.dll都有 是不是这个问题导致我总是识别失败
我现在就是这个情况,请你问你怎么搞定的?
葫芦娃的博客 2013-08-16
  • 打赏
  • 举报
回复
引用 11 楼 liu610721 的回复:
[quote=引用 10 楼 shaoshao19890119 的回复:] [quote=引用 9 楼 liu610721 的回复:] 看了下MSDN上的那个demo和楼主的一样 MSDN上有这几句“此示例要求在系统上安装手写识别器。” "添加对 WPF 墨迹分析程序集、IAWinFX.dll、IACore.dll 和 IALoader.dll(这些内容可以在 \Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 中找到)的引用。" 我的系统上有没有手写识别器我不清楚(是不是xp自带识别器?反正我没装过) 但是“\Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7”这里面没有IALoader.dll,IAWinFX.dll和IACore.dll都有 是不是这个问题导致我总是识别失败
1、Windows7系统: 正常 2、Windows Embedded Standard系统: 我设置为英文可以,但是设置为中文就识别不了, 我遇到的问题和你一样 我的系统是Windows Embedded Standard 楼主求答案! [/quote] win7自带tabletPC,windowsXp需要下一个tabletPC,里面有demo,可以看下 识别率还是挺高的[/quote] 谢谢啊 我是Windows Embedded Standard系统缺少语言组件
焖三爷 2013-08-16
  • 打赏
  • 举报
回复
引用 10 楼 shaoshao19890119 的回复:
[quote=引用 9 楼 liu610721 的回复:] 看了下MSDN上的那个demo和楼主的一样 MSDN上有这几句“此示例要求在系统上安装手写识别器。” "添加对 WPF 墨迹分析程序集、IAWinFX.dll、IACore.dll 和 IALoader.dll(这些内容可以在 \Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 中找到)的引用。" 我的系统上有没有手写识别器我不清楚(是不是xp自带识别器?反正我没装过) 但是“\Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7”这里面没有IALoader.dll,IAWinFX.dll和IACore.dll都有 是不是这个问题导致我总是识别失败
1、Windows7系统: 正常 2、Windows Embedded Standard系统: 我设置为英文可以,但是设置为中文就识别不了, 我遇到的问题和你一样 我的系统是Windows Embedded Standard 楼主求答案! [/quote] win7自带tabletPC,windowsXp需要下一个tabletPC,里面有demo,可以看下 识别率还是挺高的
葫芦娃的博客 2013-08-15
  • 打赏
  • 举报
回复
引用 9 楼 liu610721 的回复:
看了下MSDN上的那个demo和楼主的一样 MSDN上有这几句“此示例要求在系统上安装手写识别器。” "添加对 WPF 墨迹分析程序集、IAWinFX.dll、IACore.dll 和 IALoader.dll(这些内容可以在 \Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 中找到)的引用。" 我的系统上有没有手写识别器我不清楚(是不是xp自带识别器?反正我没装过) 但是“\Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7”这里面没有IALoader.dll,IAWinFX.dll和IACore.dll都有 是不是这个问题导致我总是识别失败
1、Windows7系统: 正常 2、Windows Embedded Standard系统: 我设置为英文可以,但是设置为中文就识别不了, 我遇到的问题和你一样 我的系统是Windows Embedded Standard 楼主求答案!
焖三爷 2013-02-05
  • 打赏
  • 举报
回复
看了下MSDN上的那个demo和楼主的一样 MSDN上有这几句“此示例要求在系统上安装手写识别器。” "添加对 WPF 墨迹分析程序集、IAWinFX.dll、IACore.dll 和 IALoader.dll(这些内容可以在 \Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 中找到)的引用。" 我的系统上有没有手写识别器我不清楚(是不是xp自带识别器?反正我没装过) 但是“\Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7”这里面没有IALoader.dll,IAWinFX.dll和IACore.dll都有 是不是这个问题导致我总是识别失败
焖三爷 2013-02-04
  • 打赏
  • 举报
回复
楼主,我跑了你的程序 AnalysisStatus status = theInkAnalyzer.Analyze(); status.Successful总是false,什么原因,还在查
guangzhouchenjian 2012-07-12
  • 打赏
  • 举报
回复
请问一下楼主,为什么我用了你的代码,执行到theInkAnalyzer.AddStrokes(theInkCanvas.Strokes);这一句的时候就会导致整个程序异常关闭呢?求指导……
APM60- 2012-07-12
  • 打赏
  • 举报
回复
wpf下的添加那几个dll文件的引用了么?
//IAWinFX.dll、IACore.dll 和 IALoader.dll(这些内容可以在 \Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 中找到)的引用。

5楼的方法是winform下的。
已上传http://download.csdn.net/detail/slowhand/4402438

这里有个wpf下很好用的,dll文件在项目里,识别率蛮高的。
https://skydrive.live.com/?cid=51b2fdd068799d15&sc=documents&id=51B2FDD068799D15%21686
(下载地址在右上角)
APM60- 2012-06-30
  • 打赏
  • 举报
回复
在msdn上面下载的,地址忘了。好像是一个就做TabletPC.exe的自解压包。
文件名称是inkrecognition(试试能搜到不)。
以下为原始内容:

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: InkRecognition.cs
// Simple Ink Recognition Sample Application
//
// This program demonstrates how one can build a basic handwriting
// recognition application using Microsoft Tablet PC Automation API.
// It first creates an InkCollector object to enable inking
// in the window. Upon receiving the "Recognize!" command, fired
// from the application's button, ToString() is invoked on the
// collected ink strokes to retrieve the best match using the
// default recognizer. The results are presented in a message box.
//
// The features used are: InkCollector, Ink, Strokes,
// RecognizerContext, and RecognizerResult
//
//--------------------------------------------------------------------------

using System;
using System.Drawing;
using System.Windows.Forms;

// The Ink namespace, which contains the Tablet PC Platform API
using Microsoft.Ink;

namespace Microsoft.Samples.TabletPC.InkRecognition
{
/// <summary>
/// The InkRecognition Sample Application form class
/// </summary>
public class InkRecognition : System.Windows.Forms.Form
{
// Declare the Ink Collector object
private InkCollector myInkCollector = null;

// myRecognizers is used to retrieve the number of installed recognizers
Recognizers myRecognizers;

#region Standard Template Code
private System.Windows.Forms.GroupBox gbInkArea;
private System.Windows.Forms.Button btnRecognize;
private System.Windows.Forms.TextBox txtResults;
private System.ComponentModel.Container components = null;
#endregion

/// <summary>
/// Initialize the form and ink collector
/// </summary>
public InkRecognition()
{
#region Standard Template Code
//
// Required for Windows Form Designer support
//
InitializeComponent();
#endregion

}

#region Standard Template Code
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
if (myInkCollector != null)
{
myInkCollector.Dispose();
}
}
base.Dispose( disposing );
}
#endregion

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.gbInkArea = new System.Windows.Forms.GroupBox();
this.btnRecognize = new System.Windows.Forms.Button();
this.txtResults = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// gbInkArea
//
this.gbInkArea.Location = new System.Drawing.Point(8, 0);
this.gbInkArea.Name = "gbInkArea";
this.gbInkArea.Size = new System.Drawing.Size(280, 136);
this.gbInkArea.TabIndex = 0;
this.gbInkArea.TabStop = false;
this.gbInkArea.Text = "Ink Here";
//
// btnRecognize
//
this.btnRecognize.Location = new System.Drawing.Point(8, 144);
this.btnRecognize.Name = "btnRecognize";
this.btnRecognize.Size = new System.Drawing.Size(280, 23);
this.btnRecognize.TabIndex = 1;
this.btnRecognize.Text = "Recognize Ink";
this.btnRecognize.Click += new System.EventHandler(this.btnRecognize_Click);
//
// txtResults
//
this.txtResults.BackColor = System.Drawing.SystemColors.Window;
this.txtResults.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtResults.Location = new System.Drawing.Point(8, 176);
this.txtResults.Name = "txtResults";
this.txtResults.ReadOnly = true;
this.txtResults.Size = new System.Drawing.Size(280, 20);
this.txtResults.TabIndex = 2;
this.txtResults.Text = "";
//
// InkRecognition
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 206);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.txtResults,
this.btnRecognize,
this.gbInkArea});
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.Name = "InkRecognition";
this.Text = "Ink Recognition Sample";
this.Load += new System.EventHandler(this.InkRecognition_Load);
this.ResumeLayout(false);

}
#endregion

#region Standard Template Code
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new InkRecognition());
}
#endregion

/// <summary>
/// Event Handler from Form Load Event
/// Setup the ink collector for collection
/// </summary>
/// <param name="sender">The control that raised the event.</param>
/// <param name="e">The event arguments.</param>
private void InkRecognition_Load(object sender, System.EventArgs e)
{
// Create the recognizers collection
myRecognizers = new Recognizers();

// Create a new ink collector that uses the group box handle
myInkCollector = new InkCollector(gbInkArea.Handle);

// Turn the ink collector on
myInkCollector.Enabled = true;

}

/// <summary>
/// Event Handle recognize button click event
/// </summary>
/// <param name="sender">The control that raised the event.</param>
/// <param name="e">The event arguments.</param>
private void btnRecognize_Click(object sender, System.EventArgs e)
{
// Check to ensure that the user has at least one recognizer installed
// Note that this is a preventive check - otherwise, an exception will
// occur during recognition.
if (0 == myRecognizers.Count)
{
MessageBox.Show("There are no handwriting recognizers installed. You need to have at least one in order to recognize ink.");
}
else
{

// Note that the Strokes' ToString() method is a
// shortcut for retrieving the best match using the
// default recognizer. The same result can also be
// obtained using the RecognizerContext. For an
// example, uncomment the following lines of code:
//
// using (RecognizerContext myRecoContext = new RecognizerContext())
// {
// RecognitionStatus status;
// RecognitionResult recoResult;
//
// myRecoContext.Strokes = myInkCollector.Ink.Strokes;
// recoResult = myRecoContext.Recognize(out status);
// txtResults.SelectedText = recoResult.TopString;
// }
txtResults.SelectedText = myInkCollector.Ink.Strokes.ToString();

// If the mouse is pressed, do not perform the deletion -
// this prevents deleting a stroke that is still being drawn
if (!myInkCollector.CollectingInk)
{
// Once the strokes have been recognized, delete them
myInkCollector.Ink.DeleteStrokes();

// Repaint the drawing area
gbInkArea.Refresh();
}
}
}
}
}

pooboy 2012-06-29
  • 打赏
  • 举报
回复
等待中
pz25925 2012-06-29
  • 打赏
  • 举报
回复
求方法。。 管理员果断删灌水贴了。
APM60- 2012-06-29
  • 打赏
  • 举报
回复
散分~

如果有人需要的话,再把方法贴上来。
否则就不花时间了。
用的是Microsoft.Ink

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧