Detector de distanca con una cámara y un laser mediante Matlab

beruby - te devolvemos dinero por tus compras y reservas online

Medición de distancias con un láser y una cámara mediante Matlab:

Cálculo de la distancia de un objeto a una cámara en función de la distancia entre la cámara y el láser y del ángulo que existe entre la línea del eje central de la cámara y de la línea ficticia que une el punto luminoso del láser con la cámara:





Como vemos en la imagen, según las relaciones trigonométricas aplicadas al triángulo formado por la distancia en línea recta entre la cámara y el objeto, la línea que representa  la visión del la inferencia del láser en el objeto por la cámara y la línea más izquierda del objeto (longitud h), se puede deducir que tan(Θ)=h/d; luego la distancia será d=h/tan(Θ)

De dicha ecuación, conocemos la distancia h entre la cámara y el láser, pero el ángulo es lo que necesitamos calcular y lo realizaremos mediante la siguiente expresión:

Θ=pfc*rpc+desfase, donde:

Pfc: cantidad de píxeles desde el centro del plano focal hasta el puntero láser.
Rpc: radianes que ocupa cada pixel.

Con esto podría calcular la distancia del objeto a la cámara en una imagen. Si se quisiera hacer para un vídeo, es decir, continuamente en el tiempo, tendríamos que sumarle al ángulo Θ  un factor que contendría los pequeños desplazamientos en radianes del láser en las imágenes que se van obteniendo.


El código se divide principalmente en dos partes:
    • Reconocimiento de la imagen para obtener el puntero láser.
    • Cálculos con la imagen reconocida para obtener el ángulo Θ y consigo la distancia.

Podéis encontrar el código comentado justo debajo o simplemente podéis descargaros el fichero .m en el siguiente enlace:
https://www.mediafire.com/?i14uj31sg6ttugi

Codigo:
clear all
close all
clc

%capturamos una imagen de la webcam y la guardamos en im_rgb
vid = videoinput('winvideo', 1);
a=0;
capt1 = getsnapshot(vid);
imshow(capt1);
stoppreview(vid);
im_rgb=capt1;   
%separamos las 3 componentes de la señal original en color
im_r=im_rgb(:,:,1);
im_g=im_rgb(:,:,2);
im_b=im_rgb(:,:,3);

%analizamos la componente de color rojo y buscamos el valor maximo que
%correspondera con el centro del laser en la imagen

max_r=max(im_r(1,:));
for i=120:240
    for j=1:length(im_rgb(1,:,1))
        if (im_r(i,j)>max_r)
            max_r=double(max(im_r(i,:)));
            posicion_r=i;
        end
       
    end
end

%representamos la imagen original en color para comprobar que aparece el
%laser en la imagen

figure(1),imshow(im_rgb)              
%calculamos el numero de pixeles de los que difiere el centro del laser
%desde el centro de la imagen
pfc=posicion_r - 120;

%calculamos con valores reales y con simulaciones los valores de ganancia y
%desfase mediante la expresion distancia = h/tan(pfc*ganancia+desfase)*2 de
%forma que conociendo la distancia real y la altura h en cm a la que se
%encuentra la camara respecto del laser podemos calcular los parametros
%ganancia y desfase.
ganancia = 0.0024301218;
desfase = -0.056638255;

h=5.4;%en centimetros
%aplicamos la formula con la que obtenemos la distancia
distancia = h/tan(pfc*ganancia+desfase)

Conclusión: 
Este programa que permite detectar la distancia de un objeto a la cámara depende de cada cámara y de la distancia entre la cámara y el láser por lo que se tendrá que calcular la ganancia y el desfase mediante simulación real para cada conjunto cámara láser con el que queramos usar el programa.

Este programa se puede mejorar bastante, actualmente solo mide la distancia y la devuelve en la variable "distancia". Pero se pueden añadir diversas finalidades fácilmente como puede ser el que te vaya midiendo la distancia no solo una vez sino que cuando acaba la vuelva a medir (se implementaría simplemente con un bucle "while") y también que te muestre el valor de la distancia en la imagen que representamos.

Para comprobar el correcto funcionamiento os dejo una imagen que tomo con una distancia del objeto en el que se refleja el puntero láser y la cámara de 83 cm:
Esa imagen que he tomado con la webcam, al ser analizada por el programa nos devuelve un valor de la distancia de 83.1294 en cm por lo que se aproxima bastante a la distancia real de 83cm.

El programa lo he probado con distancias  mucho menores y mayores de la representada anteriormente y funciona gracias al ajuste de los parámetros ganancia y desfase comentados anteriormente.



6 comentarios:

  1. estimado sabes que me da el siguiente error y nose como puedo arreglarlo, si me puedes orientar seria perfecto espero me respondas gracias.

    Index exceeds matrix dimensions.

    Error in d2 (line 23)
    if (im_r(i,j)>max_r)

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. hola amigo me aparece un error me podrias ayudar a arreglarlo:
    Undefined function or variable 'posicion_r'.
    Error in d2 (line 36)
    pfc=posicion_r - 120;

    ResponderEliminar
  4. Hola que tal? A qué haces referencia cuando te ubicas en la imagen con i=120:240, se qué te posiciones en esa fila y empiezas a barrer la imagen, pero por qué a partir de 120? Gracias

    ResponderEliminar