Adquisición y Procesamiento de Datos de Sensores "KINECT" en Matlab Dr. Isidro Robledo Vega División de Estudios de Posgrado e Investigación Instituto Tecnológico de Chihuahua [email protected] http://www.depi.itchihuahua.edu.mx/irobledo Sesión 2 Introducción a GUIDE ¿Cómo iniciar GUIDE? GUIDE es el Ambiente de Desarrollo de Interfaces Gráficas de Usuario de MATLAB. Proporciona un conjunto de herramientas para crear interfaces gráficas de usuario (GUI). Estas herramientas simplifican enormemente el proceso de creación y programación de GUIs. ¿Cómo iniciar GUIDE? 1. Se puede utilizar ‘guide’ desde la línea de comandos. 2. De la pestaña HOME en la seccion FILE y en el icono NEW se selecciona ‘Graphical User Interfase’ 3. Seleccionando un archivo ‘.fig’ con una interfaz guardada previamente que abre directamente la interfaz en el editor de diseño (Layout Editor). Se oprime el botón derecho de ratón sobre el archivo y se selecciona ‘Open in GUIDE’. Inicio de GUIDE En cualquiera de los dos primeros casos se abrirá la siguiente ventana: Aquí se presentan opciones para seleccionar el tipo de interfaz a construir. La primera opción nos da una interfaz en blanco (sin ningún control). La segunda opción nos da una interfaz con algunos controles preestablecidos. La tercera opción proporciona una interfaz que incluye unos ejes de graficación y un menú. La cuarta opción permite crear una caja de diálogo con preguntas y botones de control. Al seleccionar una opción se puede observar la vista previa de la interfaz. Editor de Diseño (Layout Editor) Una vez seleccionada la opción para el diseño inicial de la interfaz se abre el editor de diseño. Éste permite rellenar una interfaz gráfica de usuario haciendo clic y arrastrando componentes al área de diseño. Ahí se puede cambiar el tamaño, agrupar y alinear botones, cuadros de texto, controles deslizantes, ejes de graficación y otros componentes que se agreguen al área de diseño. Otras herramientas accesibles desde el editor de diseño permiten: o Crear menús o Crear barras de herramientas o Modificar la apariencia de los componentes o Fijar el orden de las pestañas o Ver una lista jerárquica de los objetos componentes o Configurar las opciones de la interfaz gráfica de usuario Editor de Diseño (Layout Editor) La siguiente figura muestra una interfaz en blanco en el editor de diseño. Editor de Diseño (Layout Editor) • Lo primero que debemos hacer darle un nombre seleccionando ‘File > Save As…’ del menú del editor de diseño. De esta manera crearemos un archivo con la extensión ‘.fig’. • El siguiente paso es modificar el tamaño de la interfaz seleccionando el cuadro negro en la esquina inferior derecha y arrastrándolo hasta el tamaño deseado. Si no está seguro del tamaño final, este se puede ir modificando conforme se vayan agregando componentes. • Ahora ya se puede empezar a añadir controles a la interfaz, solo se seleccionan de la barra de herramientas lateral y se arrastran hacia el área de diseño. Una vez ahí, los controles pueden ser modificados en tamaño, posición y propiedades, o eliminados. Controles de Interfaz de Usuario • En Matlab se les llama ‘uicontrol’ o los controles que se pueden agregar a una interfaz de usuario, cada uno tiene una finalidad diferente y, por lo tanto, tiene diferentes propiedades o atributos y programación. • El comando ‘handle = uicontrol('Name',Value,...)’ crea un control y le asigna las propiedades y valores especificados. Se asigna un valor predeterminado a las propiedades no especificadas en su creación. La función regresa el valor ‘handle’ que es el nombre con el cual se puede hacer referencia al objeto para modificar sus parámetros. Estilos de Controles Se utiliza la propiedad ‘Style’ para definir el tipo de control, las opciones son: 'checkbox' - Una casilla de verificación genera una acción cuando es seleccionada. Utilice las casillas de verificación para proporcionar una serie de opciones independientes. Para activar una casilla de verificación, haga clic con el botón del ratón sobre el objeto. La casilla de verificación actualiza su apariencia cuando cambia su estado. Estilos de Controles 'edit' – Este control contiene un campo de texto editable que permiten introducir o modificar los valores del texto. Utilice cajas de texto editable cuando desee que el usuario escriba texto libre como entrada. Para habilitar varias líneas de texto, establezca el atributo Max -Min > 1. Las cajas de texto multilínea proporcionan una barra de desplazamiento vertical para desplazarse. También se puede usar las teclas de flecha para desplazarse. Se puede obtener el texto de la caja utilizando la propiedad ‘String’. Esta propiedad no se actualiza a medida que se escribe, se debe hacer clic fuera de la caja de edición para actualizarla y activar su función Callback. Estilos de Controles 'frame' – Los marcos son rectángulos que proporcionan un recuadro visual en una región de la interfaz. Los marcos pueden hacer una interfaz de usuario más fácil de entender mediante la agrupación de controles relacionados. Los marcos no tienen funciones Callback asociadas con ellos. Sólo se pueden colocar controles dentro de los marcos. Los marcos o frames han sido sustituidos con paneles (uipanel) o grupos de botones (uibuttongroup) que son creados de forma similar que los del tipo uicontrol. Los frames siguen siendo soportados por GUIDE pero ya no se muestran en el Editor de Diseño. Estilos de Controles 'listbox' – Las cajas de listas sirven para mostrar una lista de elementos donde se puede seleccionar uno o más de ellos. A diferencia de los menús emergentes, las cajas de listas no se expanden cuando se hace clic. Las propiedades Min y Max controlan el modo de selección: Ajustando el atributo Max-Min> 1 se pueden seleccionar múltiples elementos. Ajustando Max-Min <= 1 permite la selección de un solo elemento a la vez. La propiedad Value almacena los índices de los elementos de la lista seleccionados en ese momento, y almacena un vector de valores al seleccionar varios elementos. MATLAB evalúa la función Callback de la caja de listas cuando se selecciona algún elemento. Estilos de Controles 'popupmenu' - Los menús emergentes (también conocidos como menús desplegables o cuadros combinados) muestran una lista de opciones cuando usted los abre con un click del ratón. Cuando está cerrado, un menú emergente indica la opción actual. Los menús emergentes son útiles cuando se quiere ofrecer una serie de opciones que se excluyen mutuamente, pero sin usar todo el espacio que requiere un grupo de botones de radio. Estilos de Controles 'pushbotton' – Los botones de pulsación generan una acción cuando son activados, es decir, cuando se hace clic sobre ellos. La función Callback se activa cuando se suelta el botón del ratón. "radiobutton" – Los botones de radio son similares a las casillas de verificación, pero se pretende que sean mutuamente excluyentes dentro de un grupo de botones de radio relacionados. Cuando se usa de esta manera, sólo se puede seleccionar un botón de radio en un momento dado. La manera más fácil de poner en práctica el comportamiento mutuamente excluyente para un conjunto de botones de radio es colocarlos dentro de un uibuttongroup. Estilos de Controles 'slider' – Con las barras de deslizamiento se puede dar una entrada numérica dentro de un rango específico. Se debe hacer click sobre el botón de la barra de deslizamiento y arrastrarlo hacia el valor deseado. También puede mover el control haciendo clic a lo largo de la barra o en los botones de flecha situados en ambos extremos. La ubicación del botón indica un valor numérico, asignado a la propiedad Value cuando suelte el botón del ratón. Puede establecer el mínimo, el máximo, los valores actuales y tamaños de paso de un control deslizante. Estilos de Controles 'text' – Las cajas de texto estático permiten la visualización líneas de texto. Normalmente se utiliza el texto estático para etiquetar otros controles, proporcionar información al usuario o indicar los valores asociados con un control deslizante. Los usuarios no pueden cambiar el texto estático de forma interactiva. Las cajas de texto estático no tienen función Callback. 'togglebutton' - Los botones de alternancia son similares en apariencia a los botones de pulsación, pero estos indican visualmente su estado, ya sea encendido (presionado) o apagado (sin presionar). Al hacer clic en un botón cambia su estado y cambia su propiedad Value entre Min y Max. Ejes de Graficación • Se puede agregar una eje de graficación dentro de una interfaz, estos objetos son llamados ‘axes’. Los ejes de graficación o ‘axes’ permiten a una interfaz gráfica de usuario mostrar gráficas e imágenes. Al igual que todos los objetos gráficos, los ejes de graficación tienen propiedades que se pueden establecer para controlar muchos aspectos de su comportamiento y apariencia. • Una vez seleccionada el área de la interfaz para desplegar los ejes de graficación, se puede modificar su apariencia mediante programación, haciendo referencia al objeto por su nombre o ‘handle’ para desplegar información usando comandos como: plot, surf, line, bar, polar, pie, contour, mesh y hasta imshow para mostrar una imagen. Tablas de Datos Se puede destinar un área dela interfaz para desplegar información en forma de tabla, este objeto se crea con el comando: uitable('PropertyName1', value1, 'PropertyName2', value2, ...) y se pueden modificar sus datos con la propiedad ‘Data’. Cada vez que se modifica algún dato se llama a la función Callback del objeto. Componentes ActiveX Al agregar un componente ActiveX a una interfaz de usuario permite desplegar un control ActiveX, estos solo están disponibles en la plataforma Windows de Microsoft y son paquetes de software que realizan funciones específicas como un temporizador o funciones para el control de algún dispositivo externo. Inspector de Propiedades Para modificar las propiedades predefinidas de un control se hace doble clic sobre éste, lo que abre la ventana del Inspector de Propiedades del Control. Ahí se puede modificar la apariencia y el comportamiento de cada control. La siguiente figura muestra una vista parcial del Inspector de Propiedades de un control del tipo ‘pushbotton’. Inspector de Propiedades Cada uno de los controles tiene propiedades particulares, a continuación se explican algunas de ellas: BackgroundColor.- Es el color usado para rellenar el rectángulo del control. Específica un color usando un vector de tres elementos RGB (rojo, verde y azul) o uno de los nombres ya predefinidos en Matlab. El color por "defecto" es determinado por la configuración del sistema. BusyAction.- Interrupción de la función Callback. Si una función Callback es ejecutada y el usuario activa otro control que también ejecuta una función Callback, esta función trata de interrumpir a la primera. La primera función Callback puede ser interrumpida solamente por uno de los siguientes comandos: drawnow, figure, getframe, pause o waitfor; si la segunda función Callback no contiene ninguno de estos comandos entonces la primera función no puede ser interrumpida. Si la propiedad Interruptible del objeto que está ejecutando la función Callback está desactivada (off), esta no puede ser interrumpida (excepto por algunas funciones). Inspector de Propiedades La propiedad BusyAction del control, cuya función Callback está esperando para ejecutarse, determina lo que le pasa a la función Callback: • Si el valor es ‘queue’, la llamada es agregada al evento ‘queue’ y se ejecuta después de que la primera función Callback termina de ejecutarse. • Si el valor es ‘Cancel’, el evento es descartado y la función Callback no se ejecuta. Nota: Si la función Callback interrumpida es una llamada de DeleteFcn o CreateFcn o una de una figura de CloseRequest o ResizeFcn, se interrumpe y ejecuta sin importar el valor de la propiedad Interrumpible del objeto. Inspector de Propiedades ButtonDownFcn.- Es la función que se ejecuta cuando se presiona un botón del ratón mientras el cursor está en el control. Callback.- Es el nombre de la función que se ejecuta cuando se activa un objeto de la clase uicontrol. Cdata.- Imagen de color verdadero mostrada en un control. Es una matriz tridimensional de valores RGB que definen una imagen de color verdadero que es mostrada ya sea en un ‘pushbutton o un ‘togglebutton’. Cada valor debe tener un rango entre cero y uno. CreateFcn.- Esta propiedad define una función que es ejecutada cuando Matlab crea un objeto de la clase uicontrol. DeleteFcn.- Esta propiedad define una función que es ejecutada cuando Matlab borra un objeto de la clase uicontrol. Inspector de Propiedades Enable.- Activa o desactiva el control. Esta propiedad define cómo los controles responden a un clic del mouse, incluyendo qué función se ejecuta. Esta propiedad cuenta con las siguientes opciones: on.- El control está activado y puede ser usado. inactive.- El control está inactivo pero se ve como si estuviera activado. off.- El control está inactivo y su etiqueta se vuelve gris. Extent.- Es un vector de cuatro elementos que define el tamaño y la posición de una cadena de caracteres usada para etiquetar el control. Tiene la forma [0, 0, width, height], los dos primeros elementos siempre son cero, width (ancho) y height (alto) son las dimensiones del rectángulo que contiene el texto. FontAngle.- Inclinación de un carácter. Poniendo esta propiedad en Italic (italica) u oblique (oblicua) selecciona una versión inclinada de la fuente, cuando está disponible en el sistema. FontName.- Es el nombre de la fuente que mostrará el texto de la etiqueta. Inspector de Propiedades FontSize.- Tamaño de la fuente del texto de la etiqueta. FontUnits.- Unidades del tamaño de la fuente. Puede ser en pixels (pixeles), inches (pulgadas), centimeters (centímetros) y points (puntos) son unidades absolutas (1 punto = 1/72 pulgada). FontWeight.- Peso de un carácter. La opción por defecto es ‘normal’. Poniendo esta propiedad en ‘bold’ hace que Matlab use una versión en "negritas" de la fuente, cuando está disponible en el sistema. ForegroundColor.- Color del texto. Esta propiedad determina el color del texto definido por la propiedad ‘String’. Especifica un color usando un vector de tres elementos RGB o un nombre de color predefinido en Matlab. HorizontalAlignment.- Esta propiedad define la alineación horizontal del texto de la etiqueta, puede ser left(izquierda), center(centrado) o right(derecha). Inspector de Propiedades Interruptible.- Esta propiedad define si se puede interrumpir la función Callback del control. Max.- Valor máximo admitido por la propiedad Value(valor) del control. Min.- Valor mínimo admitido por la propiedad Value(valor) del control. Position.- Define el tamaño y posición del control. Tiene la forma [left,bottom,width,height] donde (left,bottom) definen la posición de la esquina inferior izquierda del rectángulo que contiene al control y (width,height) son el ancho y alto del rectángulo, respectivamente. SliderStep.- Define el tamaño del paso para un control tipo ‘slider’. String.- Texto de la etiqueta del control. Para las cajas de listas y los menús se define como un vector de cadenas de texto. Inspector de Propiedades Style.- Define el tipo de control. Puede ser cualquiera de los descritos previamente. Tag.- Es el nombre del objeto definido por el usuario para fines de programación. Value.- Valor actual del control. El tipo de control define los posibles valores. Visible.- Define la visibilidad del control. Por defecto todos los controles son visibles. Cuando su selecciona off(apagado) el control no es visible, pero sigue existiendo y se pueden modificar todas sus propiedades incluyendo esta para hacerlo visible. Ejecución de la Interfaz Style.- Define el tipo de control. Puede ser cualquiera de los descritos previamEn cualquier momento se puede correr la interfaz para observar su comportamiento, ya sea seleccionando del menú ‘Tool -> Run’ o con las teclas ‘Ctrl + T’ o con el icono de la barra de herramientas. En ese momento se abrirá la siguiente caja de dialogo donde se anuncia que se creará un archivo de código de MATLAB para la programación del comportamiento de la interfaz y se guardarán los datos del archivo ‘.fig’ de la interfaz y se pregunta si se desea continuar. Ejecución de la Interfaz Al seleccionar ‘Si’ nos pedirá seleccionar la ubicación para los archivos y posteriormente mostrará la interfaz en la pantalla. La siguiente figura muestra un ejemplo de una interfaz simple donde se agregaron tres controles. Hasta este momento los controles funcionan, pueden ser seleccionados, pero no realizarán ninguna acción hasta que se modifique el archivo de código de la interfaz. Programación de la Interfaz El archivo de código tendrá el mismo nombre de la interfaz pero con extensión ‘.m’. Este archivo fue abierto en el Editor de Texto de Matlab, donde se pueden hacer las modificaciones al código para que los controles realicen las acciones deseadas desde el punto de vista del funcionamiento de la interfaz. En la siguiente figura se muestra parcialmente el archivo generado para la interfaz simple de tres controles mostrada anteriormente. En la figura se muestra la parte del código que genera Matlab cada vez que se agrega un control. Para los controles del tipo ‘pushbotton’ y ‘radiobutton’ se genera una función del tipo Callback donde se debe agregar el código que deseamos ejecutar una vez que el botón ha sido activado. Para las cajas de texto también se genera una función Callback que se activa cuando se da un ‘Enter’ dentro de la caja, además de una función CreateFcn que controla el comportamiento de la caja de texto al ser creada. Programación de la Interfaz Modificación de las Propiedades de los Objetos Las propiedades de cualquier objeto dentro de la interfaz pueden ser inspeccionadas y modificadas desde el archivo del código de la interfaz con los siguientes comandos: • get(Handle,'PropertyName').- Permite obtener información sobre la propiedad definida en ‘PropertyName’ del objeto definido por ‘Handle’. • set(Handle,'PropertyName',PropertyValue,...).- Permite modificar el valor (PropertyValue) de una determinada propiedad (PropertyName) del objeto definido por ‘Handle’. ‘Handle’ es el nombre que fue asignado al objeto en su propiedad ‘Tag’ (etiqueta) y guardado en las estructura de datos ‘handles’, esta estructura contiene los nombres de todos los objetos de la interfaz. Modificación de las Propiedades de los Objetos De esta forma, si se quiere obtener el texto escrito en una caja de textos que tiene la etiqueta ‘texto1’ y guardarlo en la variable ‘texto’ se deberá ejecutar el siguiente comando: >>texto = get(handles.texto1, ‘String’) Y si se quiere cambiar el texto en la caja ‘texto2’ por la cadena de caracteres guardada en la variable ‘texto’ se debe ejecutar el siguiente comando: >>set(handles.texto2, ‘String’, texto); Actividad 2 Generar una interfaz gráfica de usuario para realizar procesamiento de imágenes. Requisitos: La interfaz debe contener controles que permitan al usuario: 1.- Seleccionar el archivo de la imagen abriendo una caja de diálogo ‘uigetfile’ para examinar el sistema de archivos de la computadora. 2.- Mostrar el archivo de la imagen en Ejes de Graficación. 3.- Agregar las opciones de procesamiento de la Actividad 1 Función Callback del Botón Examinar % --- Executes on button press in examinar. function examinar_Callback(hObject, eventdata, handles) % hObject handle to examinar (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) [FileName,PathName] = uigetfile('*.jpg','Seleccione el archivo de la imagen'); archivo=strcat(PathName,FileName); set(handles.archivo,'String',archivo); frame=imread(archivo); if (isempty(frame)) msgbox('Error al cargar los datos del archivo','Error','error'); return; end axes(handles.axes1); image(frame); set(handles.axes1, 'Visible', 'off', 'Units', 'pixels'); Interfaz Inicial