DNM+ Online
dotnetmania 2.0
Tablet PC SDK (I) Reconocimiento de escritura manual
Los dispositivos conocidos como Tablet PC van adquiriendo día a día un mayor peso específico en el mercado de los dispositivos móviles. Estos híbridos, a medio camino entre los clásicos portátiles y las PDA, deben su éxito en gran medida a su capacidad para interactuar con el usuario mediante el uso de la escritura manual, permitiendo una interacción hombre-máquina mucho más intuitiva y natural.

Desde que el ser humano diseñó y construyó su primera herramienta, se vio en la inevitable necesidad de tomar en consideración la mejor manera de interactuar con ella, y por tanto de sacarle el máximo provecho. De este modo, observó que uniendo una empuñadura de madera a la afilada piedra usada en sus tareas diarias no sólo mejoraba la efectividad de la herramienta, sino que además podía utilizarla en nuevos campos de aplicación. Poco a poco la complejidad de las herramientas aumentó, y con ella aparecieron de nuevas y mucho más elaboradas formas de interacción. Así los medios de transporte de tracción animal requerían de un sencillo sistema para la puesta en marcha, parada y control de la dirección del vehículo basada en la domesticación del animal. Sin embargo, los sofisticados medios de transporte actuales, como por ejemplo los aviones, requieren de complejos sistemas de información y control.
Y es a partir del excesivo aumento de la complejidad de las herramientas utilizadas cuando la necesidad de interactuar con las máquinas de manera intuitiva y natural se convierte en una meta para la comunidad científica. De este modo, la aparición de las computadoras como herramientas de una gran complejidad, pero a su vez de una gran capacidad de cálculo, alimentó desde sus comienzos las expectativas de una fluida interacción hombre-máquina, basada principalmente en la comunicación oral y escrita.
Es precisamente esta última, la comunicación escrita, la que trataremos de abordar en el presente artículo. En concreto, veremos la manera de integrar en nuestras aplicaciones .NET la funcionalidad de reconocimiento de escritura.
El entorno de desarrollo Para empezar a programar aplicaciones con capacidades de reconocimiento de escritura manual, deberemos tener instalados en nuestra máquina de desarrollo los siguientes componentes:

  1. Microsoft Windows XP Tablet PC Edition Software Development Kit 1.7.
  2. 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

    1. •  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.

blog comments powered by Disqus
autor
referencias