Académique Documents
Professionnel Documents
Culture Documents
Resumen—En el siguiente trabajo, se obtuvo un programa sistema de referencia inercial, dado estas consideraciones, el
hecho en Matlab el cual mediante un patrón o escala en 2-D se primer problema a tener es como calibrar la cámara, la cual
puede hallar el tamaño de la longitud o área de un objeto cuya va a ser utilizada para capturar la imagen del objeto, y el
imágen es capturada con una camara que previamente ha sido
calibrada con el patrón inicial. segundo problema a considerar es como crear un programa
o desarrollar un codigo usando Matlab para poder hallar la
Index Terms—Calibración de cámara, Tamaño de objetos en
longitud del objeto a partir de la imagen tomada por la cámara
2-D
previamente calibrada.
II. O BJETIVOS
El objetivo general del trabajo es calcular el tamaño de la
longitud o área de objetos simples para lo cual se deberá de-
sarrollar un programa hecho en Matlab que permita hallar, con
la ayuda de una camara, dicho tamaño.
b r i l l o = imgHsv ( i , j , 3 ) ;
a = 0;
i f ( c o l o r > RangHSV ( 1 ) &&
c o l o r < RangHSV(2))&&
( s a t u r a c > RangHSV ( 3 ) &&
s a t u r a c < RangHSV(4))&&
( ( b r i l l o > RangHSV ( 5 ) &&
b r i l l o < RangHSV ( 6 ) ) )
a = 1;
imgObjet ( i , j ) = a ;
end
end
end
Figura 3. Imagen del tablero solo tomado con webcam.
Luego a la imagen se erosión con el comando imerode
y se la dilata con el comando imdilate, para acentuarla
Imagen del tablero: mas en la figura y que solo se tenga ese objeto blanco
en fondo negro.
Primero a la imagen al pasamos a escala de grises
mediante el comando rgb2gray. VI. P ROCEDIMIENTO DE S OLUCI ÓN
Después para determinar las lı́neas horizontales del Para hallar la solución del problema se ha seguido los
tablero , se pasa la convolución de la imagen mediante la siguientes pasos:
función GradientHorizontalImg ,en donde el parámetro Plantilla bidemencional.
de entrada es la imagen en escala de grises y nos devuelve 1. Deteccion de la imagen del tablero mediante imgTablero
la solo las lı́neas horizontales de la imagen del tablero 2. Calculamos los puntos del tablero PointsChess(), a las
mediante el comando conv2. coordenadas sobre el tablero en unidades de cuadardos
f u n c t i o n Gx = G r a d i e n t H o r i z o n t a l I m g ( i m g G r i s ) las denominaremos u,v y a las coordenadas en pixeles
Gx = conv2 ( i m g G r i s , [ 1 2 1 ] , ’ same ’ ) ; las denominaremos X,Y .
Gx = conv2 ( Gx,[ −1 0 1 ] ’ , ’ same ’ ) ;
3. Identificamos los puntos que forman las rectas horizon-
Para hallar las hallar las lı́neas verticales solo se rota la tales mediante la función Horizontales().
imagen y se hace el mismo procedimiento que el anterior. 4. Hallamos las ecuaciones de las rectas con la función
Mediante la función slimming ,cuya entrada es la unión rectas().
de las dos imágenes sacadas en los pasos anteriores. 5. para las verticales calculamos primero la transpuesta y
Adelgaza las lı́neas obtenidas de la convolución de tal realizamos los pasos anteriores.
manera que sean de ancho un pixel. 6. Determinamos los puntos de interseccion en la función
findPoints().
function imgHoriz = slimming ( imgHoriz ) 7. Pintamos los puntos con la función PrintfPointsBoard().
[ f c ] = s i z e ( imgHoriz ) ;
for k = 1:4 , 8. Calculamos los parametros de la cámara en la matriz
f o r i = 2 : f −1, Ratio mediante la función DetermRatio().
f o r j = 2 : c −1,
i f ( imgHoriz ( i , j ) ) Calculo de la longitud del objeto.
i f ( ( i m g H o r i z ( i −1, j ) 1. Captura de la imagen tablero con objeto Img.
&& i m g H o r i z ( i +1 , j ) ) | |
( k == 4 & i m g H o r i z ( i −1, j ) ) )
2. Identificamos el objeto por el rango usando la función
i m g H o r i z ( i −1, j ) = 0 ; IndentificObject(), esta funcion tambien permite identi-
i m g H o r i z ( i +1 , j ) = 0 ; ficar al objeto con¡mo horizontal o vertical.
end
end
3. El rango HSV del objeto lo determinamos previamente
end usando la función rang hsv()
end 4. Determinamos los puntos extremos del objeto e la matriz
end
PointObject.
5. Identificamos la celda donde se encuentre los puntos
Imagen del tablero: extremos del objeto mediante la función IdentifSquare-
ObjectInTablero().
A esta imagen se le va sacar el objeto para transportarlo 6. Finalmente determinamos la longitud del objeto medi-
a una nueva imagen con las dimensiones de la anterior ante la función lengthObject() usando el parametro Ratio
esto se hace comparándolo con el rango hsv de la figura de la cámara.
de guı́a ( donde esta el objeto del color del mismo de la
imagen) y ası́ se obtiene una imagen binarizada, que es
parte de la función indetificObjec.
for i =1:n ,
f o r j = 1 :m,
c o l o r = imgHsv ( i , j , 1 ) ;
s a t u r a c = imgHsv ( i , j , 2 ) ;
UNI-CTIC 3
Función rectas()
Luego mediante la función rectas(), se toma la imagen en
escala de grises , se calcula el gradiente horizontal usando
la función GradienthorizontalImg() para la imagen en
gris y para la imagen negativa.luego superponemos las
dos imagenes y adelgazamos los contornos horizontales
en (imgHoriz) con esto podemos calcular los puntos que
forman las rectas con la funcion anterior Horizontales(),y
finalmente con esta matriz calculamos la ecuación de la
recta en la función EcuacAdjustm().
f u n c t i o n R e c t a = r e c t a s ( imgRgb , Max Lines , c o r r y x )
i m g G r i s = r g b 2 g r a y ( imgRgb ) ;
Gx = G r a d i e n t H o r i z o n t a l I m g ( i m g G r i s ) ;
G2x = G r a d i e n t H o r i z o n t a l I m g ( 1 − i m g G r i s ) ;
i m g H o r i z = s u p e r P o s i t i o n ( Gx , G2x ) ;
imgHoriz = slimming ( imgHoriz ) ;
R e c t a = E c u a c A d j u s t m (M, c o r r y x ) ;
f u n c t i o n Gx = G r a d i e n t H o r i z o n t a l I m g ( i m g G r i s )
Gx = conv2 ( i m g G r i s , [ 1 2 1 ] , ’ same ’ ) ;
Gx = conv2 ( Gx,[ −1 0 1 ] ’ , ’ same ’ ) ;
f u n c t i o n h o r i z = s u p e r P o s i t i o n ( Gx , G2x )
Bgx = ( Gx > 0 . 9 5 ) ;
Bg2x = ( G2x > 0 . 9 5 ) ;
h o r i z = ( Bgx ) | ( Bg2x ) ;
Figura 4. Diagrama de bloques
f u n c t i o n R e c t a = E c u a c A d j u s t m (M, c o r r y x )
[ n m] = s i z e (M) ;
i f n ==1 ,
VII. S OLUCI ÓN DEL P ROBLEMA d i s p l a y ( ’ no s e e n c o n t r a r o n r e c t a s ’ ) ;
Plantilla bidimencional. return ;
end
Aquı́ explicaremos como se llego a obtener los parametros de q = 1;
la cámara: i f corr yx ,
for i =1:n ,
Primero capturamos la imagen del tablero imgTablero, N( i − 1 + 2∗mod ( i , 2 ) , : ) = M( i , : ) ;
Función Horizontales() end
Mediante la función Horizontales() se identifican los M = N;
end
puntos que forman las rectas horizontales , cuya salida for i =1:2: n ,
es una matriz 2nxm donde hay n rectas con m puntos Sx = M( i , : ) ∗ o n e s (m, 1 ) ;
que lo conforman. Sy = M( i + 1 , : ) ∗ o n e s (m, 1 ) ;
Sxy = (M( i , : ) . ∗M( i + 1 , : ) ) ∗ o n e s (m, 1 ) ;
function List Rectas = Horizontales ( horiz , Sx2 = (M( i , : ) . ∗M( i , : ) ) ∗ o n e s (m, 1 ) ;
Max Lines , imgRgb ) Sy2 = (M( i + 1 , : ) . ∗M( i + 1 , : ) ) ∗ o n e s (m, 1 ) ;
R e c t a ( 1 , q ) = ( Sxy − Sx∗Sy /m ) / ( Sx2 − Sx ˆ 2 /m ) ;
[ f c ] = size ( horiz ); i f ( (m∗Sx2 − Sx ˆ 2 ) == 0 ) ,
STEP LENG = 1 6 ; R e c t a ( 2 , q ) = M( i , 1 ) ;
else
NUMB = [ 1 : STEP LENG + 1 ] ; R e c t a ( 2 , q ) = ( Sy∗Sx2 − Sx∗Sxy ) / ( m∗Sx2 − Sx ˆ 2 ) ;
ONES = o n e s ( 1 , STEP LENG + 1 ) ; end
seguir = 0; q = q + 1;
lineas = 1; end
cont = 0;
max Steps = 15; Función findpoints()
L i s t R e c t a s = zeros ( 1 , max Steps ) ; Luego usando la función findPoints(), hallamos los pun-
i = 3∗STEP LENG ;
Save Index i = 0; tos de intersección de las rectas horizontales y verticales.
w h i l e i <= f −2∗STEP LENG , f u n c t i o n Coor = f i n d P o i n t s ( R e c t a s x , R e c t a s y )
j = 10; [ f n ] = s i z e ( Rectas x ) ;
w h i l e j <= c−2∗STEP LENG , [ f m] = s i z e ( R e c t a s y ) ;
. for i =1:n ,
. f o r j = 1 :m,
. m1 = R e c t a s x ( 1 , i ) ;
end b1 = R e c t a s x ( 2 , i ) ;
i f ( ( l i n e a s −1)/2 >= Max Lines ) m2 = R e c t a s y ( 1 , j ) ;
break ; b2 = R e c t a s y ( 2 , j ) ;
end i f i s n a n ( m1 ) ,
j = j + 1; Coor ( i , j , : ) = [ b1 , b1 ∗m2 + b2 ] ;
UNI-CTIC 4
Análogo si es horizontal.
Función rang hsv:
Figura 5. Tablero
ANEXO
X. P ROGRAMA P RINCIPAL
function ObjectDetected (x , y )
close all
i m g T a b l e r o = d o u b l e ( i m r e a d ( ’ \ I m a g e n e s \ img16 . j p g ’ ) ) ;
Coor = P o i n t s C h e s s ( x , y , i m g T a b l e r o ) ;
img = d o u b l e ( i m r e a d ( ’ . . \ I m a g e n e s \ img9 . j p g ’ ) ) . / 2 5 5 ;
RangHSV = r a n g h s v ( ’ . . \ I m a g e n e s \ o b j e t c o l o r . JPG ’ ) ;
h = I n d e n t i f i c O b j e c t ( RangHSV , img ) ;
Figura 7. Captura de puntos
P o i n t O b j e c t = h {1};
IX. C ONCLUSIONES H = h {2};
V = h {3};
Se logró implementar una plantilla bidimensional con
cuadrı́culas de 2 cm2 . P o i n t O b j e c t I n U V = I d e n t i f S q u a r e O f O b j e c t I n T a b l e r o ( Coor
PointObject );
Con la ayuda de la plantilla se pudo calibrar la cámara
web. R a t i o = D e t e r m R a t i o ( Coor ) ;
Con el desarrollo de un programa hecho en Matlab se
l o n g = l e n g t h O b j e c t ( Coor , P o i n t O b j e c t ,
pudo hallar la longitud de objetos lineales en posición P o i n t O b j e c t I n U V , R a t i o , H, V)
horizontal y vertical.
imgErode = i m e r o d e ( i m g O b j e t , o n e s ( 3 ) ) ;
i m g D i l a = i m d i l a t e ( imgErode , o n e s ( 3 ) ) ;
[ n m] = s i z e ( i m g D i l a ) ;
vec = [ ] ;
for i = 1: n ,
f o r j = 1 :m,
i f imgDila ( i , j ) ,
vec = [ vec [ i j ] ’ ] ;
end
end
end
mx = min ( v e c ( 1 , : ) ) ;
Mx = max ( v e c ( 1 , : ) ) ;
my = min ( v e c ( 2 , : ) ) ;
My = max ( v e c ( 2 , : ) ) ;
UNI-CTIC 7
i f ( ( P o i n t O b j e c t ( q , 1 ) − Coor ( i , j , 1 ) ) > 0
& ( P o i n t O b j e c t ( q , 2 ) − Coor ( i , j , 2 ) ) > 0 ) ,
d1 = abs ( P o i n t O b j e c t ( q , 1 ) − Coor ( i , j , 1 ) ) ;
d2 = abs ( P o i n t O b j e c t ( q , 2 ) − Coor ( i , j , 2 ) ) ;
i f ( d > s q r t ( d1 ˆ 2 + d2 ˆ 2 ) )
d = s q r t ( d1 ˆ 2 + d2 ˆ 2 ) ;
p(q , : ) = [ i j ];
end
end
end
end
end
f o r i = 1 : n −1,
f o r j = 1 :m−1,
p e r i m e t r o = s q r t ( ( ( [ Coor ( i , j , 1 )
[ Coor ( i +1 , j , 1 ) , Coor ( i , j , 2 ) ] ) . ˆ 2 ) ∗ o n e s ( 2 , 1 ) ) ;
perimetro = perimetro +
Coor ( i +1 , j , 2 ) ] ) . ˆ 2 ) ∗ o n e s ( 2 , 1 ) ) ;
perimetro = perimetro +
Coor ( i +1 , j + 1 , 2 ) ] ) . ˆ 2 ) ∗ o n e s ( 2 , 1 ) ) ;
perimetro = perimetro +
Ratio ( i , j ) = 8/ perimetro ;
end
end
f u n c t i o n l o n g = l e n g t h O b j e c t ( Coor , P o i n t O b j e c t , p , R a t i o , H, V)
long = 0;
point = PointObject ( 1 , : ) ;
i f (V)
j = p(1 ,2);
f o r i =p ( 1 , 1 ) : p ( 2 , 1 ) ,
i f ( i ˜= p ( 2 , 1 ) )
v1 = P o i n t O b j e c t ( 2 , : ) − p o i n t ;
v2 = [ Coor ( i +1 , j , 1 ) , Coor ( i +1 , j , 2 ) ] ;
A = [ v2 ’ , −v1 ’ ] ;
b = ( p o i n t − [ Coor ( i +1 , j + 1 , 1 ) ’ ;