7. DETECCIÓN DE OBJETOS 1 PROCESAMIENTO DIGITAL
7.12. CAPTURA DE IMAGEN/VIDEO
La primera fase para el desarrollo y procesamiento de una imagen es su captura, y mediante el software Matlab, genera unas herramientas para lograrlo. Se desarrolla el código en base a tres métodos: imagen almacenada, captura de una sola foto y captura de una secuencia de imágenes. Se describen de la siguiente manera:
a. Imagen almacenada
Se requiere almacenar una imagen en un formato específico (jpeg, png, tif) dentro de la carpeta que va a contener los archivos generados por Matlab (Extension Matlab code). Este software tiene la ventaja de contener herramientas de programación orientadas al tratado y procesamiento de
imágenes, por ejemplo, para la lectura de estas el comando imread será que nos facilitará esta acción:
X = imread('nombredelarchivo.jpg');
b. Captura de una sola imagen
Dentro de las herramientas para el tratamiento de imágenes (Image processing toolbox) podemos realizar una captura ya sea con el dispositivo por defecto que tiene un computador (laptop) o con un dispositivo externo conectado por medio de USB. Saber las características de los dispositivos como, la cantidad, la
compatibilidad con el software, cuál está en uso, su resolución, entre otras, es posible a través del comando imaqhwinfo y retorna la siguiente información:
InstalledAdaptors: {'gentl' 'gige' 'matrox' 'winvideo'} MATLABVersion: '8.2 (R2013b)'
ToolboxName: 'Image Acquisition Toolbox' ToolboxVersion: '4.6 (R2013b)'
Estos valores son para el caso de una computadora Dell y que al momento ejecutar el comando tenía conexión a un dispositivo externo (Cámara Genius facecam 320). Para escoger el mejor adaptador se mira las características de cada uno de esta manera:
imaqhwinfo('winvideo') ans = AdaptorDllName: [1x81 char] AdaptorDllVersion: '4.6 (R2013b)' AdaptorName: 'winvideo' DeviceIDs: {[1] [2]} DeviceInfo: [1x2 struct] >> imaqhwinfo('gentl') ans = AdaptorDllName: [1x78 char] AdaptorDllVersion: '4.6 (R2013b)' AdaptorName: 'gentl' DeviceIDs: {1x0 cell} DeviceInfo: [1x0 struct] >> imaqhwinfo('gige') ans =
AdaptorDllName: [1x77 char] AdaptorDllVersion: '4.6 (R2013b)' AdaptorName: 'gige' DeviceIDs: {1x0 cell} DeviceInfo: [1x0 struct] >> imaqhwinfo('matrox') ans = AdaptorDllName: [1x79 char] AdaptorDllVersion: '4.6 (R2013b)' AdaptorName: 'matrox' DeviceIDs: {1x0 cell} DeviceInfo: [1x0 struct]
Se observa que dentro del dispositivo winvideo existen dos artefactos con diferentes IDs y se escoge por dos razones: uno porque es el dispositivo que habitualmente almacena las características de la cámara por defecto del
computador y dos porque al conectar el dispositivo externo toda su información va a permanecer aquí. Se debe observar las características de cada dispositivo para identificar cual valor es el que contiene la cámara Genius:
imaqhwinfo('winvideo',1) ans =
DefaultFormat: 'YUY2_160x120' DeviceFileSupported: 0
DeviceName: 'FaceCam VGA' DeviceID: 1 VideoInputConstructor: 'videoinput('winvideo', 1)' VideoDeviceConstructor: 'imaq.VideoDevice('winvideo', 1)' SupportedFormats: {1x5 cell} >> imaqhwinfo('winvideo',2) ans = DefaultFormat: 'YUY2_160x120' DeviceFileSupported: 0 DeviceName: 'WebCam SCB-0350M' DeviceID: 2 VideoInputConstructor: 'videoinput('winvideo', 2)' VideoDeviceConstructor: 'imaq.VideoDevice('winvideo', 2)' SupportedFormats: {1x5 cell}
Se crea un objeto con las características del adaptador y con esto, obtener la información sobre cuáles son los formatos que puede soportar este dispositivo de captura:
info=imaqhwinfo('winvideo');
info1=info.DeviceInfo.SupportedFormats info1 =
'YUY2_160x120' 'YUY2_176x144' 'YUY2_320x240' 'YUY2_352x288' 'YUY2_640x480'
Con esta información es posible crear un objeto para video de entrada al cual le vamos a asignar las propiedades, y estará encargado de establecer una conexión entre el software y el dispositivo de captura:
video1=videoinput('winvideo',1,'YUY2_640x480');
Las herramientas del software permiten que el programador pueda cambiar propiedades de captura, por ejemplo, en que escala se puede hacer
('grayscale'|'rgb'|'YCbCr'|'bayer'). Por último, se toma una toma con el comando getsnapshot haciendo uso del objeto creado con las propiedades del dispositivo de captura:
video1. ReturnedColorSpace='rgb'
X=getsnapshot(video1);
c. Captura de una secuencia de imágenes
A partir del proceso anterior, se puede continuar con la fase para la captura de video. Para esto se hacen cambios sobre las propiedades del objeto, por ejemplo:
vid=VideoWriter('tesis.avi'); triggerconfig(video1, 'manual') video1.LoggingMode='disk&memory'; video1.DiskLogger=vid; video1.TriggerRepeat=500; video1.FramesPerTrigger=1; video1. ReturnedColorSpace='rgb';
Donde triggerconfig Permite que el programador pueda ejecutar manualmente El inicio, la pausa y remover el objeto. LoggingMode Peremite especificar el lugar de almacenamiento dentro del ordenador ('disk' | 'disk&memory' | {'memory'}).
DiskLogger Indica en cuál variable se va aguardar la grabación, en este caso la variable “vid” está encargada de generar una escritura con extensión .avi.
TriggerRepeat le proporciona al programador la opción de que una propiedad del trigger se ejecute una cierta cantidad de veces (0 (default)|Inf | entero positivo), y a partir de esto, especificar la cantidad de frames capturados por cada vez que se ejecute el trigger FramesPerTrigger, siendo este caso un frame.
Para que estos procesos se ejecuten repetidamente y de manera coordinada, se determina la creación de un objeto que tenga propiedades de un reloj que sincronice el sistema (timer) pero ajustando sus propiedades para las funcionalidades del programa:
t=timer;
set(t,'BusyMode','Drop');
set(t,'ExecutionMode','fixedRate');
set(t,'Period',1/20);
set(t,'TimerFcn',{@Grabar,video1});
Se modifica las propiedades dentro de la función timer y el objeto “t”, por ejemplo, 'BusyMode' permite indicar la acciones que se va a tomar ('drop', 'error','queue') cuando el timer sea ejecutado, en este caso “drop” indicará a la
función a ejecutar en forma de gotas. La propiedad 'ExecutionMode' permite organizar un cronograma de eventos cada vez que se ejecute ('singleShot', 'fixedRate', 'fixedDelay', 'fixedSpacing'), para este caso 'fixedRate' indica el arranque inmediatamente después de ejecutar la funciones del timer, ya que la función se va a ejecutar una determinada de cantidad de veces. 'Period' permite que exista un intervalo de tiempo entre cada una de elas ejecuciones. Por último, por medio de la propiedad 'TimerFcn' se le indicará al objeto, la acción que deba ejecutar cuando se llame la función, por ejemplo, llamará a la función Grabar(video1), enviándole como parámetro de entrada el objeto del video.
También operaran las acciones del trigger y se establece una bandera que indicará el número de frames adquiridos en la ejecución de la siguiente manera:
start(video1); start(t); stop(t); delete(t); stop(video1);
frameslogged=video1.FramesAcquired delete(video1);
clear functions;
Dentro de la función Grabar() se hará específicamente la captura del video pero únicamente una captura, ya que esta función se llamará un número determinado de veces y no solamente obtendrá la imagen, sino también la impresión por pantalla de los resultados que en una fase más adelante se explicara detalladamente. Para obtener la imagen se hace a través de:
trigger(video1)
data=getdata(video1,1,'uint8');
Donde la función Getdata retorna n frames especificados en la propiedad
FramesPerTrigger.
7.3.EXTRACCIÓNDERUIDO