Microsoft Windows XP Tablet PC Edition 2005 Recognizer
Pack.
Microsoft Windows XP Tablet PC
Edition Software Development Kit 1.7
Microsoft Windows XP Tablet PC Edition Software Development Kit
1.7 es la última versión disponible del kit de desarrollo para la
plataforma Tablet PC.
Este kit de desarrollo se compone de bibliotecas administradas y
de automatización que permiten el desarrollo de aplicaciones con
reconocimiento de escritura manual y de voz, así como de
desplazamiento mediante el uso del lápiz óptico.
Para instalar el kit de desarrollo, procederemos en primer lugar a
descargarlo desde la página Web habilitada al efecto (ver cuadro de
recursos Web). Una vez descargado, procederemos a su instalación en
nuestro equipo, para lo que ejecutamos el fichero Setup.exe.
Siempre es interesante seleccionar la instalación personalizada, ya
que pinchando sobre cada una de las opciones disponibles podremos
ver una pequeña descripción de cada una de ellas.
Antes de continuar, y con el objeto de entender un poco mejor el
siguiente paso a realizar, accederemos a "Inicio" | "Programas" |
"Microsoft Tablet PC Plattform SDK" y ejecutaremos "Samples and
Source Code", tras lo cual lanzaremos el ejemplo "Ink Recognition"
de la sección "Recognition". Una sencilla aplicación de ejemplo nos
invita a escribir cualquier texto sobre un panel titulado "Ink
Here", para luego pulsar sobre el botón "Recognize Ink". Sin
embargo, si ejecutamos tal acción, un mensaje de error aparecerá
casi al instante indicando que no existen reconocedores de texto
manuscrito instalados y que necesitamos al menos uno de ellos para
ejecutar el ejemplo (figura 1). Precisamente esto es lo que
realizaremos a continuación.
Microsoft Windows XP Tablet PC
Edition 2005 Recognizer Pack
Microsoft Windows XP Tablet PC Edition 2005 Recognizer Pack es lo
que permitirá a nuestras aplicaciones reconocer el texto escrito de
manera manual mediante el uso de la tinta digital y convertirlo a
texto estándar (entendiendo como texto estándar aquel que el
ordenador almacena como una cadena de caracteres). Actualmente el
reconocedor de escritura manual soporta los siguientes idiomas:
chino (tradicional y simplificado), inglés (US y UK), francés,
alemán, italiano, japonés, coreano y por supuesto español.
Para instalarlo, procederemos una vez más a descargarlo desde el
sitio Web de Microsoft (ver cuadro de recursos Web). En esta
ocasión, la instalación personalizada nos dará la opción de elegir
que idiomas queremos instalar. Para seguir los ejemplos de este
artículo con instalar el idioma español es suficiente.
Si ahora ejecutamos de nuevo el ejemplo "Ink Recognition", veremos
cómo al pulsar sobre el botón "Recognize Ink" la aplicación ya no
solo no nos mostrará el error, sino que entenderá a la perfección
el texto introducido (figura 2). Aquí podemos probar a escribir
diferentes tipos de texto manuscrito y comprobar la eficacia del
reconocedor incluso con textos cuyas letras se enlazan unas con
otras en un solo trazo. Sin embargo, este ejemplo no es de los
mejores en cuanto a eficacia de reconocimiento de escritura, que se
puede aumentar exponencialmente si de antemano sabemos el tipo de
información que va a ser escrita, mediante el uso de diferentes
técnicas que serán abordadas en detalle en el próximo
artículo.
El control InkEdit
Ha llegado el momento de empezar a desarrollar nuestras propias
aplicaciones de reconocimiento de escritura manual. Para ello,
abrimos Microsoft Visual C# 2005 Express Edition y creamos un nuevo
proyecto mediante la opción de menú "File" | "New Project". Al
aparecer el asistente de creación de nuevo proyecto, seleccionamos
"Windows Application" y le ponemos un nombre al proyecto (por
ejemplo, InkEditTest). Por defecto, Visual Studio nos mostrará el
formulario Form1 en su vista de diseño.
Antes de poder utilizar los controles InkEdit e InkPicture,
debemos hacerlos disponibles en el entorno de desarrollo. Para
ello, es conveniente crear inicialmente una nueva categoría (que
denominaremos "Microsoft Ink") en el Cuadro de herramientas, y en
ella colocaremos los componentes InkEdit e InkPicture (figura
3).
El control InkEdit es el más sencillo de todos los controles
existentes dentro del Tablet PC SDK. Tan sencillo que permite
capturar trazos de tinta digital y hacer su reconocimiento de
manera automática sin que tengamos que escribir ni una sola línea
de código. Como era de esperar, es con diferencia el menos flexible
de todos ellos. Pero veamos cómo se utiliza.
Desde el Cuadro de herramientas pincharemos y arrastraremos el
control InkEdit hasta situarlo sobre el formulario de la
aplicación, como haríamos con cualquier control que quisiéramos
situar sobre nuestro formulario. Observamos que su aspecto es muy
similar al del clásico control RichTextBox, y de hecho comparte
muchas de sus propiedades. No podía ser de otro modo, ya que la
clase InkEdit deriva directamente de este último. Pero si
observamos las propiedades del control, veremos que dispone de una
categoría específica, denominada Ink; esta categoría es la que
precisamente nos va a permitir determinar la manera en que va a
comportarse el control InkEdit en cuanto a lo que tinta digital y
reconocimiento de escritura manual se refiere. Las propiedades son
las siguientes:
• Cursor. Determina la forma del cursor al pasar sobre el
control.
• Factoid. Esta propiedad acepta una cadena de caracteres
que determina el tipo de información que va a recoger el control y
que aumenta considerablemente el ratio de aciertos de
reconocimiento.
• InkInsertMode. Existen dos modos:
• InsertAsText. En este modo el control InkEdit reconoce los
trazos escritos y los inserta como texto. Es el modo por defecto.
• InsertAsInk. Utilizado en los casos en los que deseemos
que los trazos escritos no sean reconocidos y sustituidos por su
equivalente en texto (por ejemplo, si queremos capturar una firma).
Suele usarse en combinación con el método SaveFile. Este modo sólo
funciona en las versiones Tablet PC del sistema operativo Windows
XP.
• InkMode. Ofrece tres valores:
• Disabled. No permite la introducción de tinta
digital.
• Ink. Permite la introducción de tinta digital, únicamente
para ser reconocida como texto.
• InkAndGesture. Permite la introducción de tinta digital,
tanto para ser reconocida como texto, como para ser reconocida como
gestos. Los gestos son unos trazos especiales que permiten entre
otras cosas borrar un carácter (backspace), borrar todo el texto
(scratch), introducir un salto de línea (intro), etc.
• RecoTimeout. Es el tiempo que nuestro control tarda desde
que ha recibido el último trazo de tinta digital hasta que intenta
realizar el reconocimiento.
• UseMouseForInput. Si queremos usar nuestro ratón como si
de un puntero de Tablet PC se tratase y por tanto probar nuestra
aplicación, deberemos poner esta propiedad a true.
Inicialmente pondremos la propiedad UseMouseForInput a true y
dejaremos el resto de las propiedades con su valor por defecto.
Ejecutamos la aplicación y probamos a escribir algún texto mediante
el uso del ratón o tableta digitalizadora, si disponemos de ella
(figura 4). Al cabo de dos segundos, el texto será reconocido e
insertado como texto en el control InkEdit (figura 5). Y todo ello
sin una sólo línea de código. Puede probar a cambiar las diferentes
propiedades del control para estudiar cómo se comporta.
El control InkPicture
A diferencia del control InkEdit, el control InkPicture deriva de
la clase Picture y está pensado principalmente para mostrar
imágenes sobre las que poder escribir con tinta digital, pero en
las que no necesitemos reconocimiento de escritura manual. Sus
aplicaciones prácticas pasarían desde la captura de firmas de
clientes hasta la señalización por parte de un perito de las zonas
dañadas tras un siniestro directamente sobre la fotografía del
vehículo. ¿Significa esto que no es posible reconocer los trazos
introducidos sobre el control InkPicture y convertirlos en texto?
No, simplemente significa que no lo hará de manera automática,
aunque ello es perfectamente posible mediante programación. A
continuación veremos cómo, pero antes exploremos las propiedades
que diferencian al control InkPicture de su clase padre:
• AutoRedraw. Indica si la tinta digital trazada sobre el
control será repintada cuando el control sea invalidado. Un control
se invalida cuando deja de ser visible; por ejemplo, al posicionar
temporalmente una ventana sobre él. Su valor por defecto es
true.
• CollectionMode. Equivalente a la propiedad InkMode del
control InkEdit, determina si se detectarán los trazos como tinta,
gestos o ambos.
• DynamicRendering. Valor lógico que indica si los trazos se
muestran o no conforme son dibujados. Si ponemos esta propiedad a
false, ello equivaldría a dibujar con "tinta invisible".
• EditingMode. Especifica si el puntero creará trazos, los
borrará o seleccionará para su escalado y posicionamiento. Esta
propiedad es de gran utilidad si en vez de ser establecida en
tiempo de diseño se hace mediante programación.
• EraserMode. Esta propiedad determina si al borrar se
eliminarán trazos enteros o solamente la sección del trazo por
donde pase el puntero.
• EraserWidth. Grosor del puntero de borrado. Esta propiedad
es relevante únicamente en el caso de que el valor de EraserMode
sea PointErase.
• InkEnabled. Indica si se encuentra activa la recolección
de trazos. En caso de estar desactivada, no podremos pintar sobre
el control.
• MarginX. Esta propiedad establece un margen de seguridad
en el eje X sobre el que se podrá pintar aún a pesar de estar fuera
de los límites del control InkPicture.
• MarginY. Equivalente a la propiedad MarginX pero en el eje
Y.
• SupportHighContrastInk. Especifica si la tinta será
representada en alto contraste cuando el sistema se encuentre
configurado en modo de contraste alto, utilizado por personas con
deficiencias visuales.
• SupportHighContrastSelectionUI. Especifica si el cuadro de
manipulación de trazos (EditingMode = Select) será representado en
alto contraste cuando el sistema se encuentre configurado ese
modo.
Para entender mejor algunas de estas propiedades, veremos un
sencillo ejemplo en el que crearemos un simple editor de trazos
utilizando el control InkPicture. Para ello, arrastraremos dicho
control sobre un formulario en blanco y crearemos cuatro
botones: uno para crear trazos, otro para seleccionarlos y
modificar su tamaño y posición, otro para borrar trazos enteros y
otro para borrar segmentos de trazo. El código correspondiente a
este ejemplo puede verse en el listado 1.
Al ejecutar la aplicación podemos observar claramente las
diferencias existentes entre los diferentes valores de EditingMode
(figura 6) y EraserMode.
Reconociendo texto manuscrito con el control
InkPicture
Hasta aquí hemos visto brevemente la sencillez y potencia del
control InkPicture para crear trazos, seleccionarlos, modificarlos
y borrarlos de diferentes modos. Sin embargo, no hemos visto la
manera de reconocer los trazos introducidos como texto manuscrito,
que es al fin y al cabo el objetivo primordial de este artículo.
Como comentaba al principio de la presente sección, el control
InkPicture no proporciona ningún método para el reconocimiento
automático de la escritura manual, sin embargo con unas pocas
líneas de código es posible efectuar esta tarea de manera sencilla.
Para ello, añadiremos al formulario del ejemplo anterior un botón,
cuyo evento Click contendrá toda la lógica del reconocimiento y un
cuadro de texto donde mostraremos el resultado (podemos ver el
resultado final en la figura 7).
A continuación analizaremos el código a añadir asociado al nuevo
botón de reconocimiento, y que puede verse completo en el listado
-
• En primer lugar, creamos una nueva instancia de la clase
Recognizers (reconocedores) que no es ni más ni menos que el
conjunto de reconocedores de texto instalados.
• Una vez creada dicha instancia, comprobamos si existe o no
algún reconocedor instalado en el sistema; si no es así mostramos
un mensaje y finalizamos la ejecución.
• A continuación, obtenemos el reconocedor por defecto
mediante el uso del método GetDefaultRecognizer de la clase
Recognizers, el cual puede aceptar un parámetro de tipo int que
indica el código identificador de idioma (LCID), o lo que es lo
mismo, el idioma para el que estamos obteniendo el
reconocedor por defecto. En caso de que no se proporcione dicho
parámetro, el idioma se determina en función del Idioma
predeterminado del dispositivo de entrada configurado a través del
Panel de control, Configuración regional y de idiomas (pestaña
"Idiomas", botón "Detalles").
• Asimismo, creamos un contexto de reconocimiento
(RecognizerContext), el cual permitirá en última instancia el
reconocimiento de escritura manual que esperamos, y definimos un
resultado de reconocimiento (RecognitionResult) que almacenará el
resultado del reconocimiento y un estatus de reconocimiento
(RecognitionStatus) que guardará el estado generado tras el
reconocimiento.
• A través de la propiedad Ink.Strokes, obtenemos los trazos
realizados en el control InkPicture y los asignamos a los trazos
del contexto reconocedor. Si existe por lo menos algún trazo,
efectuamos el reconocimiento mediante una llamada al método
Recognize del contexto y lo asignamos al resultado de
reconocimiento. El estatus de reconocimiento se obtiene como
parámetro por referencia.
• Por último, de todas las posibles alternativas de
reconocimiento almacenamos en una cadena de caracteres la que el
reconocedor ha clasificado como las más probable (TopString), y la
mostramos en el cuadro de texto habilitado al efecto.
En la siguiente entrega
En este artículo hemos preparado el entorno de desarrollo
necesario para la programación de aplicaciones capaces de aceptar
tinta digital para más tarde reconocerla como escritura manuscrita.
Así mismo, hemos analizado y utilizado los principales elementos
que para este fin proporciona Microsoft Windows XP Tablet PC
Edition Software Development Kit.
Sin embargo, han quedado sin tratar muchos temas interesantes
relacionados con el reconocimiento de la escritura manual mediante
el uso de Microsoft Windows XP Tablet PC Edition SDK, como por
ejemplo la posibilidad de añadir características de tinta digital a
cualquier control que decidamos mediante el uso de la clase
InkOverlay, la mejora del reconocimiento mediante el uso de
Factoids (cadenas predefinidas que proporcionan al reconocedor
información sobre el tipo de texto a reconocer) y WordLists (listas
predefinidas de palabras), o por ejemplo el uso de Gestures (gestos
especiales no reconocidos como palabras y que permiten la ejecución
de acciones a medida).
Trataremos todos estos temas en detalle en la próxima entrega;
espero no nos falléis y veros de nuevo el mes que viene.