BIENVENIDO

Hola que tal a todos los enamorados de Matlab o que simplemente esten haciendo algo en este programa. dejen sus comentarios. espero pueda ayudarles esto en algo

Programa en matlab detectar ojos cerrados o abiertos en matlab codigo de proyecto

ESTE ES EL PROGRAMA QUE ABIA COMENTADO. _DETECTA OJOS CERRADOS O ABIERTOS_

DEJO EL CODIGO PARA QUE LO CORRAN

CUALQUIER DUDA ESTARE DISPUETO A RESPONDER.

ESPERO LES GUSTE


% DETECTAR OJOS CERRADOS/ABIERTOS
clc,close all, clear all;
fprintf('\n');disp('*****MENU*****');display('-----MENU-----');fprintf('\n')
op=input('1=TOMAR FOTO \n2=LEER UNA IMAGEN DE OJOS CERRADOS\n3=LEER UNA IMAGEN DE OJOS ABIERTOS \n ');
disp(op);
switch op
    case 1
 
        % TOMAR FOTO
        imaqreset;
        vid=videoinput('winvideo',1);
        preview(vid);
        pause(5);
        foto=getsnapshot(vid);
        sav=input('quieres guardar la imagen (s/n)?: ','s');
        if (sav=='s')
            %imwrite(foto,'foto.jpg');
            fprintf('\n escogiste guardar la imagen resultado')
            naming = input('\n tipo y nombre de la imagen (filename.ext) : ','s');
            fprintf('\n guardando ...')
            imwrite(foto,naming);
            fprintf('\n el archivo se llama %s y esta guardado en el directorio de trabajo de matlab',naming)
        else
            fprintf('\n escogiste no guardar la imagen de resultados');
        end
        im=foto;
        stop(vid);
        delete(vid);
        %break;
    case 2
        %LEER FOTO cerrada
        im=imread('cerrado_02.jpg');
    case 3
        im=imread('abierto_02.jpg');
end

gris=rgb2gray(im);
dou=im2double(gris);
figure, imshow(dou);

% RECORTE de la imagen
recorte=imcrop;                        
figure, imshow(recorte), title('imagen recortada original');

 % normalizado de imagen mejor visual
hist=histeq(recorte);              
 pause(2),figure,imshow(hist),title('imagen procesada con histograma');

 %ajuste de CONTRASTE
for i=0.2:0.1:0.6
    contraste=imadjust(recorte,[],[],i);% incremento de contraste con valor i
    pause(2),figure(4),imshow(contraste),title(['Ajuste de constraste #',int2str(i)],'Color','b');
    disp(i);
end
zoom on;zoom(.90);
%BORDES
beep;beep;beep;
disp('SELECCIONE UN METODO PARA DETERMINAR EL CONTORNO');
a=input('\n1=sobel\n2=canny\n3=prewitt\n4=roberts\n5=log\n6=zero-cros\n');
disp(a);
switch a
    case 1
        contorno=edge(contraste,'sobel'); %canny, sobel, prewitt,roberts,laplacian&gausian(log),zeros-cross
        pause(2),figure(5), imshow(contorno),title('METODO SOBEL');
            imwrite(contorno,'sobel.jpg');
    case 2
        contorno=edge(contraste,'canny'); %canny, sobel, prewitt,roberts,laplacian&gausian(log),zeros-cross
        pause(2),figure(5), imshow(contorno),title('METODO CANNY');
            imwrite(contorno,'canny.jpg');
    case 3
        contorno=edge(contraste,'prewitt'); %canny, sobel, prewitt,roberts,laplacian&gausian(log),zeros-cross
        pause(2),figure(5), imshow(contorno),title('METODO PREWITT');
            imwrite(contorno,'prewitt.jpg');
    case 4
        contorno=edge(contraste,'roberts'); %canny, sobel, prewitt,roberts,laplacian&gausian(log),zeros-cross
        pause(2),figure(5), imshow(contorno),title('METODO ROBERTS');
            imwrite(contorno,'roberts.jpg');
    case 5
        contorno=edge(contraste,'log'); %canny, sobel, prewitt,roberts,laplacian&gausian(log),zeros-cross
        pause(2),figure(5), imshow(contorno),title('METODO LAGRANGE&GAUS');
            imwrite(contorno,'lagrange_gaus.jpg');
    case 6
        contorno=edge(contraste,'zerocros'); %canny, sobel, prewitt,roberts,laplacian&gausian(log),zeros-cross
        pause(2),figure(5), imshow(contorno),title('METODO ZERO-CROS');
            imwrite(contorno,'zero_cros.jpg');
end

%pause(3),figure(6),
%subplot(3,2,1),imshow('sobel.jpg'),title('BOBEL');subplot(3,2,2),imshow('canny.jpg'),title('CANNY');
%subplot(3,2,3),imshow('prewitt.jpg'),title('PREWITT');subplot(3,2,4),imshow('roberts.jpg'),title('ROBERTS');
%subplot(3,2,5),imshow('lagrange_gaus.jpg'),title('LAGRANGE');subplot(3,2,6),imshow('zero_cros.jpg'),title('ZEROCROS');

%REMOVER objeto menor a N pixeles

disp('REMOVER objeto menor a N pixeles');
for j=1:1:3
imag2=bwareaopen(contorno,j);%N=1,2,5,10,15,20
pause(2),figure(7),subplot(3,1,j),imshow(imag2),title(['obj removidos menores a: ',int2str(j)],'color','b');
disp(j);
end

disp('incremento de la figura disk(circulo)con N=1,2,3,4,5,6,7,8,9');
for k=1:1:5
     disp(k);
     se=strel('disk',k); %incremento de la figura disk(circulo)con N=1,2,3,4,5,6,7,8,9
     imag3=imclose(imag2,se);
     pause(2),figure(8),subplot(5,1,k),imshow(imag3),title(['incremento de disk en ',int2str(k)],'color','b');
end

imag4=imfill(imag3,'holes'); %rellena los agujeros de la imagen
pause(2),figure(9),imshow(imag4),title('imagen con obj removidos');


[B,L] = bwboundaries(imag4,'noholes');
    stats = regionprops(L,'all');
    a = regionprops(L, 'area');
    areas = cat(1, a.Area);
    area_max=max(areas);
    indice_area_max=find(areas==area_max);
    boundary_area_max = B{indice_area_max};
    [filas,columnas]=size(boundary_area_max);
    max_x=max(boundary_area_max(:,2));
    min_x=min(boundary_area_max(:,2));
    max_y=max(boundary_area_max(:,1));
    min_y=min(boundary_area_max(:,1));
    imagen_area_max=zeros(max_x,max_y);
    for i=1:filas
        imagen_area_max(boundary_area_max(i,1),boundary_area_max(i,2))=1;
    end
    x= boundary_area_max(:,2);
    y= boundary_area_max(:,1);
    x_media= round((max_x-min_x)/2);
    x_inicial= (min_x + x_media);
    indices = find(x==x_inicial);
    y_correspondientes= y(indices);
    y_inicial = min(y_correspondientes);
    i=1;
        while(x_inicial ~= min_x)
            x_inicial= x_inicial-1;
            x_vector(i)=x_inicial;
            indices = find(x==x_inicial); % bien
            y_correspondientes= y(indices);
            y_inicial = min(y_correspondientes);
            y_vector(i)=y_inicial;
            i=i+1;
        end
    BW = imagen_area_max;
    se = strel('disk',3);
    BW = imclose(BW,se);
    BW = imfill(BW,'holes');
    BW=~BW;
    [filas,columnas] = size(imagen_area_max);
    col = round(columnas/2)-10;
    javi=find(imagen_area_max(:,col));
    row = min(javi);
    figure,
    imshow(recorte);
    hold on;
    plot(x_vector,y_vector,'g*','LineWidth',2);
    x = x_vector;
    y = y_vector;
    longitud_x=length(x);
    longitud_y=length(y);
    abc=[x' y' ones(length(x'),1)]\[-(x'.^2+y'.^2)];
    a = abc(1); b = abc(2); c = abc(3);
    xc = -a/2;
    yc = -b/2;
    radius = sqrt((xc^2+yc^2)-c);
    plot(xc,yc,'gx','LineWidth',2); %grafica el centro de la imagen
    theta = 0:0.01:2*pi;
    Xfit = radius*cos(theta) + xc;
    Yfit = radius*sin(theta) + yc;
    plot(Xfit, Yfit);
    centro_y=yc;
    media_y=mean(y_vector);
    if centro_y <= media_y
        disp('IMAGEN 1: OJOS cerrados')
        message = sprintf('Ojos Cerrados');
        text(15,15,message,'Color','y','FontWeight','bold');
    else
        disp('IMAGEN 1: OJOS abiertos')
        message = sprintf('Ojos Abiertos');
        text(15,15,message,'Color','y','FontWeight','bold');
    end

msgbox('....FIN DEL PROGRAMA....');

pause(5), clc,close all;

11 comentarios:

  1. En el primer menú cambia esto y pide el nombre de la imagen:

    case 2
    %LEER FOTO cerrada
    im=imread('cerrado_02.jpg');
    case 3
    im=imread('abierto_02.jpg');

    Estoy probando el programa, de momento se me queda colgado, gracias por el aporte.

    ResponderEliminar
  2. DISCULPA QUE NO SEPA MUCHO.PERO ME PARECE MUY IMPORTANTE.COMO LO TRASPASO A MATLAB??COMO EMPIESO..BUENO SI ME AYUDARAS TARIA MUY AGRADECIDO XQ LO NECESITO PARA UN EXAMEN

    ResponderEliminar
    Respuestas
    1. no pasa nada que no sepas, siempre por algo se empieza..Bueno es muy simple solo necesitas copiarlo y pegarlo en un script nuevo de matlab. eso lo consigues oprimiendo en el icono de la hoja en blanco o tambien ir al menu"barra de herramientas"
      Algo si te recomiendo es que si te lo pidieron para un examen es por que ya te lo habran explicado entonces pues pide ayuda con tu maestro tambien o algun compañero
      Nota: espero no sea demasiado tarde mi respuesta

      Eliminar
  3. Hola como puedo detectar 3 colores (R G B) y pasarlos a simulink para fuzzificarlos ?
    Para poder desfuzzificarlos en un Arduino
    Estamos en proyecto de titulo necesito ayuda gracias

    ResponderEliminar
  4. Buen dia, gracias por tu aporte... Me podrias ayudar dandome un consejo de como podria hacer este mismo proceso pero en tiempo real?, osea directamente con la web cam.. gracias

    ResponderEliminar
    Respuestas
    1. te aconsejo que le quites la parte donde pide guardar la imagen y desde ahi utilices algun ciclo como el for, y vallas guardando cada imagen con un nombre distinto y trabajes sobre cada una de ellas

      Eliminar
  5. hola necesito saber en qué formato guardo la foto ya que me sale este error del if ,
    if (isempty(format))

    format = get_format_from_filename(filename);
    if (isempty(format))
    error('MATLAB:imwrite:fileFormat', 'Unable to determine the file format from the filename.');

    estoy viendo tu algoritmo ya que necesito cojer una camara y poder detectar los ojos de la persona para hacer un sistema para el proyecto final de ingeniería. estoy aprendiendo mucho de tu algoritmo para poder hacer el propio mio, si puedes ayudarme te lo agradeceria, yo estaré usando el controlador de arduino para trabajar con la camara. gracias....

    ResponderEliminar
    Respuestas
    1. creo necesitas dar el nombre y la extension cuando te lo pida ejemplo: imagen1.jpg
      en el programa aparece esta linea de codigo revisala
      naming = input('\n tipo y nombre de la imagen (filename.ext) : ','s');
      suerte

      Eliminar
    2. salió todo bien, el unico problema que tengo es que cuando quiero tomar la foto desde un video en matlab no me sale la foto en los diagramas para ver si el programa sabe si están los ojos abiertos o cerrados, gracias por contestar....

      Eliminar
    3. salio todo bien, el problema es con el video, cuando hago el snapshot se tarda mucho en salir la imagen para saber si estan los ojos cerrados o abiertos, yo puedo hacer este proceso directo? sin tener que preguntar por cual metodo determino el contorno? y cual de los metodos es mas eficiente y rapido? te pregunto para asi saber si de esta forma el algoritmo es más veloz, ya que necesito comparar fotos en milisegundos, gracias por ayudarme, (estoy estudiando sistemas de potencia, pero el proyecto al ser de ingenieria no tenía que ser obligatorio de sistemas de potencia y como a todos nos enseñan a usar matlab nos dieron este problema para resolver y por eso necesito aprender mucho de tu algoritmo) muchas gracias

      Eliminar
  6. hola amigoo buen dia me gustaria saber si puedes explicarme en si el codigo como funciona o si tienes algun documento que me puedas facilitar para esto muchas gracias mi correo es sfrengifo@unicauca.edu.co

    ResponderEliminar