Beruflich Dokumente
Kultur Dokumente
COMPUTADORA
CON
MATLAB Y OPENCV
Alejandro I. Barranco G.
Sal Martnez Daz
Jos L. Gmez T.
NDICE
RESUMEN
CAPTULO 1. INTRODUCCIN
1.1. OBJETIVO
1.2. ASPECTO INNOVADOR DEL LIBRO
CAPTULO 2. FUNDAMENTOS DE VISIN POR COMPUTADORA
5
6
6
10
12
13
14
DIMENSIONES
2.4. LECTURA DE IMAGEN BMP EN MATLAB
2.5. LECTURA DE VIDEO DIRECTO DESE UNA CM ARA CONECTAD A
16
16
A LA PC DESDE MATLAB
2.6 OBTENCIN DE UNA FOTOGRAFA A PARTIR DE UNA CM ARA
DE
16
VIDEO EN MATLAB.
17
17
22
24
26
26
28
33
34
36
44
44
47
49
4.4 TRIANGULACIN
50
4.5 MEDICIN
52
57
58
63
64
72
72
74
77
81
83
ESTREO
6.6 TRIANGULACIN
87
6.7 MEDICIN
94
96
113
RESUMEN
Este libro presenta las bases tericas y prcticas de la visin estereoscpica por
computadora en Matlab y OpenCV. La idea es que se utilice como documento de
apoyo en el aprendizaje de visin estereoscpica por computadora. Se plantea una
competencia general: solucin al problema del reconocimiento de objetos 3D en
imgenes, considerando la informacin de tres dimensiones (3D) proporcionada por
un sistema de visin estereoscpico con cmaras digitales convencionales. La
necesidad surge de la flexibilidad requerida por la dinmica de los sistemas en la
vida real, donde los objetos no pueden ser capturados por mdulos de visin que
requieren el objeto a reconocer a una distancia fija respecto de las cmaras digitales
que lo capturan o donde las dimensiones de los objetos son factor importante para
realizar el reconocimiento. Aqu se propone la solucin con un tipo
de
del
mundo actual.
Ya
que se encuentra
mtodo
descubre
de manera
automtica los detalles para encontrar matemticamente los rasgos de cada objeto
en la imagen, esta tarea no se deja en las manos del talento de una persona.
CAPTULO 1
INTRODUCCIN
En este trabajo se proporcionan las bases que tienen por objetivo resolver el
problema del reconocimiento de objetos a partir de la visin estereoscpica por
computadora. La Figura 1., ilustra el ejemplo de un mini robot que navega de forma
autnoma y utiliza la tcnica de visin estereoscpica para percibir su entorno.
Figura 1. Ilustra un mini robot que navega de manera autnoma e identifica los
obstculos a su alrededor con la tcnica de visin estereoscpica.
utilizando
cmaras
digitales
fotografas
videos
digitales.
La
visin
calibracin
de
cmara
fotogrfica o comnmente
obtener
los parmetros
por medio
mencionados
de la
computadora. Los
parmetros
antes
calibracin),
el
en este
documento
es el
reconocimiento
de objetos, tambin
una imagen.
Aportes del
computadora:
CAPTULO 2.
FUNDAMENTOS DE LA VISIN
POR COMPUTADORA
Una versin amplia de la historia de la visin por computadora se encuentra en [1] y
de forma resumida en [2]. Uno de los motivos ms importantes que inspiraron a
trabajar en esta rea de investigacin a miles de cientficos y a nosotros; es que la
visin en las personas, es uno de los mecanismos sensoriales de percepcin ms
importantes
en
el
ser
humano,
a hablar
sobre esta
percepcin
disciplina, comencemos
Adquisicin de imgenes
Restauracin de imgenes
Compresin de imgenes
10
reconocimiento
de
patrones
sofisticadas,
pues
de automatizacin
que se
han
computadora
es estudiada
11
Campo de
Ejemplos
aplicacin
Robtica
Medicina
Astronoma
Control de
calidad
Cartografa
Reconstruccin en 3D de terrenos.
Seguridad
que
este
puede
decidir
los movimientos
a realizar
para
evadir
12
Figura 4. Imagen digital de una habitacin tomada por una cmara digital para ser
analizada.
Para saber cmo trabajar con imgenes que provienen de una cmara digital es
necesario conocer la tcnica utilizada en las fotografas digitales. Este proceso, se
lleva a cabo por medio de un dispositivo llamado CCD (del ingls Charge-Coupled
Device, "dispositivo de cargas (elctricas) interconectadas"). El dispositivo CCD es
un circuito integrado que contiene un
nmero
determinado
de
condensadores
13
El CCD est compuesto por una matriz de nxm nmero de sensores de luz que
translucen la energa luminosa a movimiento de electrones para provocar una
corriente elctrica. En la Figura 5., se muestra la configuracin de un sistema CCD:
la matriz de sensores conectados a un circuito acondicionador de la seal y despus a
un circuito integrado que muestrea (lee la seal que proviene de los sensores) cada
cierto tiempo T la seal que enva cada sensor de luz del CCD para despus
almacenar la informacin en una memoria temporal. Por ltimo la informacin de
la memoria es enviada al software que se encargar de guardar, visualizar o editar la
imagen capturada.
14
por adicin de los tres colores luz primarios. Es frecuente que cada color primario se
codifique con un byte (8 bits). As, de manera usual, la intensidad de cada
una de las componentes se mide segn una escala que va del 0 al 255. Por lo tanto,
el rojo se obtiene con (255,0,0), el verde con (0,255,0) y el azul con (0,0,255),
obteniendo, en cada caso un color resultante monocromtico. La ausencia de color
se obtiene cuando las tres componentes son 0, (0, 0, 0). La combinacin de dos
colores a nivel 255 con un tercero en nivel 0 da lugar a tres colores intermedios. De
esta forma el amarillo es (255,255,0), el cyan (0,255,255) y el magenta (255,0,255).
Obviamente, el color blanco se forma con los tres colores primarios a su mximo
nivel (255, 255, 255). En la Figura 6., se muestra una imagen RGB como una matriz
de M x N y su descomposicin en el modelo RGB [16][17].
Figura 6. La imagen digital a color del tipo RGB se representa por medio de 3
matrices de dimensiones M x N donde cada matriz representa la cantidad de color
rojo, verde o azul de la imagen.
15
16
I=getsnapshot(vid);
imshow(I)
ROJO=I(:,:,1)
VERDE=I(:,:,2)
AZUL=I(:,:,3)
Donde los dos puntos (:) indican todos; as que lo podemos interpretar como todas
las columnas y todas las filas de la matriz del ndice que corresponda (1,2 3).
17
Figura 7. El principio
y es nombrado como P. El
18
entonces:
(1)
19
Figura 9. Una fotografa que muestra personas en distintas posiciones del espacio.
la
fenmeno propuesta
por
continuacin (2).
(2)
donde:
20
(3)
el sistema
21
(4)
22
Las matrices de rotacin alrededor de cada uno de los ejes del sistema de
coordenadas X, Y y Z se muestran a continuacin respectivamente.
] (5)
23
(6)
],
| ]
(7)
y fy nos
24
Figura 12. La geometra del pxel influye en la manera de modelar las imgenes
digitales, las dimensiones de fx y fy; as como el ngulo s, tambin llamado sesgo.
Entonces para encontrar el punto de la fotografa que corresponde con el punto del
espacio fotografiado se utiliza la ecuacin (2) pero sta puede ser simplificada para
utilizar slo una matriz en lugar de utilizar dos. Este paso se muestra en la ecuacin
(9).
[
][
| ][ ]
(8)
][ ]
(9)
25
CAPTULO 3.
MTODOS DE CALIBRACIN DE
CMARAS
3.1 MTOD O DE FOU GERAS
La calibracin de una cmara por este mtodo consiste en conocer los parmetros
intrnsecos (4 parmetros si se considera el skew como cero) y los parmetros
extrnsecos de la cmara (6 parmetros; las rotaciones y desplazamientos respecto a
un sistema de referencia). Partiendo de la ecuacin (4) podemos observar que al
dar un punto [X,Y,Z,1]T del espacio es posible mapearlo en el plano de la cmara
con coordenadas (u,v,); si consideramos a =1 slo para tomarlo en cuenta
despus (esta es la restriccin que considera el mtodo de Fougeras); entonces
obtenemos el siguiente conjunto de ecuaciones:
(10)
(11)
26
calibracin de una cmara. Por cada punto expresado en las ecuaciones (10) y (11)
contamos con 2 ecuaciones; por lo tanto para
obtener
el
valor de los 12
(12)
(13)
(14)
Fougeras propone resolver (9) haciendo m34=1, ya que m34 ser no nula, debido a
que el sistema que estudiamos no trata con objetos que se encuentran en el lente de
una cmara y m34 es simplemente la componente Z del vector de traslacin entre el
sistema coordenado del mundo exterior y el sistema de referencia de la cmara. La
desventaja con este mtodo es que el resultado queda escalado y es una incgnita. El
mtodo se describe a continuacin:
27
Si m34=1,
[ ]
(15)
(16)
(17)
28
(18)
29
[ ]
[ ]
donde:
[ ]
[ ]
(19)
es llamada homografa.
(20)
(21)
Dado que R es una matriz de rotacin, los vectores que la componen cumplen las
restricciones de ortonormalidad es decir,
y que
por lo
(22)
(23)
Estas son las dos restricciones bsicas de los parmetros intrnsecos dada una
homografa. Para resolver este problema se propone una solucin analtica seguida
de una optimizacin no lineal. La matriz
]=
[
(24)
Teniendo en cuenta que se trata de una matriz simtrica se puede definir con un
vector de 6 elementos de la forma (en realidad, describe la imagen de la cnica
absoluta):
30
(25)
Por lo tanto si la columna i-sima de la matriz H es
(26)
Donde:
[
]
(27)
Con estas
expresiones se pueden
(28)
(29)
(30)
(31)
(32)
(33)
31
(34)
Ya que A es conocida los parmetros extrnsecos para cada imagen son fcilmente
calculados como:
(35)
De manera
normalizadas en la imagen.
(36)
(37)
, entonces tenemos:
(38)
(39)
Como se espera tener una distorsin radial pequea primero se calculan los
parmetros intrnsecos, ignorando razonablemente la distorsin radial, entonces
para estimar
32
][
(40)
Dados m puntos en las n imgenes, podemos apilar todas las ecuaciones juntas para
obtener un total de 2mn ecuaciones, o en forma de matriz como Dk=d, donde
k=[k1,k2]T. la solucin por mnimos cuadrados es:
(41)
Esta seccin presenta los pasos puntuales para realizar la calibracin de un sistema de
visin estereoscpica en Matlab con diferentes cmaras web. Para mayor claridad se
dividir en varias partes:
33
312.
NOTA: En algunas ocasiones la opcin de captura por default de las web cam integradas en
Matlab tiene muy baja resolucin, del orden 160x120. Si esto pasa, Matlab incluye una
herramienta llamada imaqtool, que mediante un entorno grfico nos permite cambiar
parmetros como la resolucin o el modelo de color (YCbCr, rgb o grayscale). En la
seccin session log de imaqtool aparecen las instrucciones que debemos agregar a nuestro
script para establecer los parmetros que necesitemos cambiar al correr nuestro script.
34
script Matlab desde el botn New Script mostrado en la Figura 15 y agregando el siguiente
cdigo.
35
bien,
agregamos
la
carpeta
descomprimida a las rutas de Matlab dando click en File Set Path. Si cualquiera de las
36
escribimos izq_ y damos enter. Acto seguido se nos consulta el formato de las imgenes:
37
declaramos, convertidas a escala de grises. Aqu se puede observar a lo que nos referimos
con distintas orientaciones y distancias en cada fotografa, Figura 19.
Damos enter para indicar que procesaremos todas las imgenes con sufijo izq_. Aparecer
un nuevo mensaje/consulta:
Window size for corner finder (wintx and winty):
wintx ([] = 5) =
En este punto cabe aclarar dos cosas, la primera es que nosotros no utilizamos el patrn de
OpenCV, sino uno de 7x9 con cuadros de 3 cm por lado; la segunda es que Matlab
interpreta wintx como el nmero de cuadros en vertical y winty como el nmero de cuadros
en horizontal, aunque podramos llegar a pensar que es a la inversa. Aclarado lo anterior,
nosotros ingresamos el valor 5 en wintx y 7 en winty (dos cuadros menos de los que tenga
su cuadrcula por lado, ya se ver por qu) y ante la pregunta que hace el script:
38
39
Aqu se espera que este claro por qu se defini wintx = 5 y winty = 7, ese el nmero de
cuadros que incluimos en la seleccin. Esta ventana no la cierren, solo resturenla o
minimcenla para poder especificar en la ventana de comandos de Matlab las dimensiones
de los cuadros del patrn, en milmetros. En este caso son de 3 cm, es decir 30 mm, como
muestra la Figura 21.
40
Generalmente esto no ser necesario, as que daremos enter para declarar que no ser
necesario. Debemos repetir la seleccin de esquinas para todas las imgenes, poniendo
atencin en seleccionar los mismos puntos, en el mismo orden en cada ocasin. Al terminar
con las 10 imgenes damos click en la opcin calibration del men de calibracin standard.
Aparecern los datos de calibracin en la ventana de comandos de Matlab como muestra la
Figura 24.
41
42
En esta ventana, mientras ms cercanos a cero estn los puntos es un indicador de que se
realiz una calibracin confiable. Cerramos esta ventana y damos click en el botn Save del
men de calibracin. Esto crear dos archivos llamados
Calib_Results.m y
es
recomendable
renombrarlos
como
Calib_Results_Izq.m
los
archivos
resultantes
como
Calib_Results_Der.m
43
CAPTULO 4.
CALIBRACIN ESTEREOSCPICA
(x,y) en dos
las configuraciones de
44
Figura 26. Se muestran dos sistemas de referencia en azul claro y azul oscuro,
donde el primero localiza al segundo y los puntos expresados a partir del sistema
de referencia azul oscuro pueden expresarse desde el sistema de referencia azul
claro.
45
Figura 27. (a) Dos cmaras separadas 70 mm., a una distancia infinita la
disparidad estreo es cero. (b) Cmaras acopladas para uso en visin
estereoscpica.
los parmetros
46
(41)
47
(43)
(44)
(45)
Las ecuaciones (42) (43) (44) y (45) pueden ser agrupadas y arregladas para
escribirse en forma matricial:
(46)
(47)
(48)
(49)
(50)
48
(51)
Damos clic en la opcin Load left and right calibration files y especificamos el
nombre que le dimos a los archivos .mat, es decir Calib_Results_Izq.mat y
Calib_Results_Der.mat cuando sean solicitados. Para que en la ventana de
comandos se observe algo similar a lo que presenta la Figura 30.
49
4.4 TRIANGULACIN
Abrimos un nuevo script en Matlab y agregamos el siguiente cdigo:
x_left_1=zeros(2,1);
x_right_1=zeros(2,1);
figure(1)
I=imread('izq_1.bmp');
imshow(I)
[x_left_1(1,1), x_left_1(2,1)] = getpts(figure(1)); %Punto a
analizar de la cmara izquierda
figure(2)
D=imread('der_1.bmp');
imshow(D)
[x_right_1(1,1), x_right_1(2,1)] = getpts(figure(2)); %Punto
a analizar de la cmara derecha
50
51
Lo que nos permite inferir que la cmara izquierda est ligeramente (poco ms de 1
cm) ms atrs que la cmara derecha, como en realidad ocurre.
4.5 MEDICIN
x_Izq_1=zeros(2,1);
x_Der_1=zeros(2,1);
%Punto 1 a analizar de la cmara izquierda.
figure(1)
I=imread('izq_1.bmp');
imshow(I)
[x_Izq_1(1,1), x_Izq_1(2,1)] = getpts(figure(1));
52
53
Seleccin del punto 1 en la imagen izquierda como la mostrada en las Figuras 34, 35,
36 y 37.
54
55
Como antes se mencion cada cuadro mide 3 cm de lado, por lo que la medicin es
precisa con una tolerancia de medio milmetro, lo que an puede deberse a un fallo
en la seleccin de los puntos, demostrndose el nivel de precisin que alcanzan los
mtodos.
56
CAPTULO 5.
RECONOCIMIENTO DE FORMAS
El crear en una mquina habilidades como la de detectar y determinar la identidad
de los objetos que se encuentran a su alrededor contina siendo uno de los retos ms
importantes en el mundo de la visin por computadora. Mquinas como estas
pudieran liberar al hombre de tareas peligrosas y en otros casos con poca necesidad
de la presencia de una persona para realizarlas, as como realizar tareas
imposibles de ejecutar por el ser humano, como tareas a altas temperaturas, con
fuerza mayor a la del brazo humano. De forma general un sistema para el
reconocimiento automatizado de objetos (SRAO) permite a una maquina encontrar
(reconocer y posicionar en una imagen) objetos de su entorno a partir de una o
ms imgenes del mundo real, usando modelos de los objetos conocidos a priori. El
problema del reconocimiento automtico de objetos puede definirse como un
problema de etiquetado que se basa en modelos de objetos conocidos. Formalmente
el problema se puede describir de la siguiente forma: Dada una imagen que contiene
uno o ms objetos de inters, adems del fondo, y un conjunto de etiquetas (una para
cada regin de la imagen), el sistema debe asignar las etiquetas correctas desde el
punto de vista de correspondencias respecto a modelos conocidos a regiones o
conjuntos de regiones en la imagen, como se muestra en la Figura 17.
57
Figura 17. Figura 39. A la izquierda una imagen con algunos de los objetos
conocidos que se enumeran a la derecha de la presente figura.
5.1 COMPONENTES DE UN SR AO
En los ltimos aos se han propuesto muchas metodologas para el SRAO, pero
generalmente se incluyen los siguientes componentes.
Un banco de modelos
58
Figura 18. Figura 40. Diagrama a bloques de un SRAO tpico con flujos de
informacin.
59
Figura 19. Figura 50. Para obtener un mejor rango de trabajo se aumenta el
contraste de una imagen, mejorndola para procesamiento posterior.
objetos conocidos.
60
Figura 20. Figura 51. El segmentador se encarga de extraer slo los objetos que
interesan al anlisis que se est desarrollando en cada aplicacin.
5.1.4 GE NERADOR
DE HIP TES IS .
61
Almacena todos los modelos de los objetos que el sistema reconocer, dependiendo
de la tcnica utilizada, puede ser una descripcin funcional o cualitativa general de
cada objeto o una descripcin geomtrica precisa del mismo.
Compara los rasgos de los objetos extrados por el generador de hiptesis con los
modelos almacenados en el banco de modelos, de acuerdo a la identificacin de
las diferencias menores, se marcan a los objetos que mayor certidumbre tienen
de haber sido identificados, conforme a la regla definida por el diseador del
mdulo.
que al
dar
62
cercana
que
no
posible
la
realidad
estn fundamentadas.
Se
del
mismo,
utiliza
para
sin
hacer
conjuntos
(58)
Para
Debido a que
[13] que dichos ndices generan un conjunto infinito de momentos que determinan
unvocamente cada funcin
determinados por
(59)
63
El momento
momentos
describe el rea de
y
describen el centroide de
(60)
se utilizan
los momentos centrales que son invariantes a traslaciones de una regin en diferentes
posiciones dentro de la imagen. Los momentos centrales se definen como:
(61)
(62)
64
)(
) [(
)(
) ]
) [(
) [(
)(
) ]
)
) ]
)(
)(
)[ (
)
)[ (
) ]
)
) ]
donde:
, con
para
65
Ejemplo:
Tenemos 6 formas distintas en una imagen de blanco y negro que sern
caracterizadas por los 8 invariantes de Hu: un rectngulo, circulo, flecha, triangulo y
una cruz mostrados en la Figura 21.
%
%
%
%
%
%
%
%
Abrimos la imagen
Se convierte de RGB a escala de grises
Se crea un arreglo de 2x1 de imgenes
Se despliega la imagen en la primera posicin
Se indexa la segunda posicin del arreglo
Se segmenta la imagen por umbral de 0.5
Se invierte el valor de cada pixel binario
Despliega la imagen binaria invertida
66
67
% Etiquetado de componentes
% solicitud de una nueva ventana de
for i=1:N
subplot(2,3,i)
O=objeto(L,i);
imshow(O)
end
function I=objeto(L,k)
[M,N]=size(L);
I=zeros(M,N);
for i=1:M
for j=1:N
if(L(i,j)==k)
I(i,j)=1;
else
I(i,j)=0;
end
end
end
68
69
70
71
CAPTULO 6.
CALIBRACIN DE CMARAS EN
OPENCV
6.1 INTRODUCCIN
El presente captulo aborda los pasos para la calibracin de un arreglo estreo de
cmaras en OpenCV. Una vez calibrado, el sistema podr realizar triangulacin de
puntos en el espacio, lo que permitir la ubicacin de objetos con respecto a las
cmaras y la medicin de distancias en fotografas capturadas por stas. Las
siguientes actividades se consideran necesarias para lograr el objetivo:
72
Para realizar la calibracin es necesario contar con un patrn que puede ser una
cuadrcula, semejante a un tablero de ajedrez, o bien un patrn con un conjunto de
crculos. En este caso se usar la cuadrcula (Figura 52.), que puede encontrarse en
doc/pattern.png, de la documentacin de OpenCV.
Como al calibrar deben conocerse las dimensiones de los cuadros, por practicidad se
recomienda que antes de imprimir se ajuste la imagen para que cada cuadro mida un
nmero entero de centmetros. Otro aspecto importante es que el patrn debe ser
perfectamente plano, as que despus de imprimirse debe pegarse en una tabla u otra
superficie plana y rgida.
Matriz de la cmara
Matriz de 3x3 con la siguiente estructura:
[
donde:
fx y fy son el ancho y alto de la longitud focal, respectivamente, generalmente
expresados en pixeles;
cx y cy son las coordenadas del punto pri
ncipal de la cmara, generalmente el centro de la imagen.
73
Matriz esencial
Contiene informacin sobre la traslacin y rotacin que relaciona a las dos cmaras
fsicamente en el espacio.
Matriz fundamental
Proporciona la misma informacin que la matriz esencial, con el aadido de que los
parmetros intrnsecos de ambas cmaras tambin forman parte de ella.
74
En cada fotografa el patrn debe aparecer en distinta posicin, ya que imgenes con
el patrn en la misma posicin no contribuyen a la calibracin. Como se ha dicho, la
calibracin requiere un conjunto de imgenes, por tanto el primer paso para la
calibracin es obtener esas imgenes. Dado que se va a calibrar un sistema estreo la
captura se realizar con las cmaras ya instaladas en esa configuracin (Figura 55.),
cuidando que el patrn aparezca completamente en ambas cmaras.
75
76
nombreDer = msgDer.str();
imwrite( nombreIzq, GrisI);
//Guardar GrisI en Capturas/izq_#.jpg.
imwrite( nombreDer, GrisD); //Guardar
GrisD en Capturas/der_#.jpg.
}
desplegarContador(frameI, cont, numFotos);
//Mensaje de foto tomada en pantalla.
//Mostrar las imgenes tomadas.
imshow("Vista previa Derecha.", frameD);
imshow("Vista previa Izquierda.", frameI);
}
cout<<"Termina la captura de imagenes.\n\n";
}
void desplegarContador(Mat view, int Contador, int Total)
{
const Scalar BLUE(255,0,0); //Orden inverso.
despContador.str("");
despContador<<"Foto "<<Contador<<" de "<<Total<<"
tomada.";
string msj = despContador.str();
int baseLine = 0;
Size textSize = getTextSize(msj, 1, 1, 1, &baseLine);
Point textOrigin(view.cols - 2*textSize.width - 10,
view.rows - 2*baseLine - 10);
putText(view, msj, textOrigin, 1, 1, BLUE);
}
/samples/cpp/tutorial_code/calib3d/camera_calibration/camera_calibration.cpp.
77
Figura 56. Directorio con el cdigo y archivos para calibracin de una cmara.
Camera_calibration.cpp
Contiene el cdigo que deberemos copiar en un proyecto de C++ y compilar.
in_VID5.xml
Parmetro de entrada del programa. Contiene la configuracin con que ha de
realizarse la calibracin, aqu se especifican entre otras cosas:
VID5.xml
78
out_camera_data.yml
Los dos parmetros ms importantes que devuelve son la matriz de la cmara y los
coeficientes de distorsin, el formato en que son devueltos (yml) puede observarse
en la Figura 57 (tambin pueden recuperarse en formato xml) .
79
Esto abrir una instancia del smbolo del sistema, donde escribiremos el nombre del
ejecutable y el xml de entrada como parmetro, ver Figura 59.
80
Al final el programa muestra las imgenes sin distorsin (puede oprimirse q o Esc
si no se desea verificar cada imagen). Como muestra la Figura 61.
cdigo
para
la
calibracin
estreo
se
encuentra
en
/samples
/cpp
81
El nombre del xml con las rutas a las fotografas que se utilizarn en la calibracin.
El nmero de cuadros que tiene el patrn de ancho, precedido de w.
El nmero de cuadros que tiene el patrn de alto, precedido de h.
As, si utilizamos el xml de la documentacin de OpenCV, la instruccin sera:
stereocalib.exe
82
83
parmetros:
flags: Banderas que pueden ser cero o alguna combinacin de los siguientes
valores.
84
proporcin fx/fy.
distorsin
correspondiente
durante
la
optimizacin.
Si
calculados
al
mtodo
stereoCalibrate.
Establecer
la
bandera
Captura estreo.
Calibracin estreo.
85
86
6.6 TRIANGULACIN
El razonamiento general de la triangulacin es que al fotografiar el mismo objeto con
el sistema estreo las diferencias en las fotografas y el conocimiento de la posicin
de las cmaras harn posible calcular la posicin del objeto respecto a las cmaras.
El cdigo para la triangulacin est basado principalmente en el blog
Morethantechnical [20], que a su vez est basado en el algoritmo propuesto en el
libro Multiple View Geometry in Computer Vision de Hartley y Zisserman, aunque
fueron necesarias ligeras modificaciones. El cdigo final para el funcionamiento en
vc++ se muestra a continuacin.
El mtodo principal para realizar la triangulacin es LinearLSTriangulation.
/** From "Triangulation", Hartley, R.I. and Sturm, P.,
Computer vision and image understanding, 1997 */
Mat_<double> LinearLSTriangulation(Point3d u, //Punto
homogneo de la primera imagen (u,v,1).
Matx34d P, //Matriz de la
cmara 1.
Point3d u1, //Punto
homogneo de la segunda imagen.
Matx34d P1 //Matriz de la
cmara 2.
) {
//Construir la matriz A para el sistema homogneo de
ecuaciones Ax = 0.
//Se asume que X = (x,y,z,1), para el mtodo lineal LS
//que se convierte en un sistema AX = B, donde A es de
4x3, X de 3x1 y B de 4x1.
87
Matx43d A(u.x*P(2,0)-P(0,0),
u.x*P(2,2)-P(0,2),
u.y*P(2,0)-P(1,0),
u.y*P(2,2)-P(1,2),
u1.x*P1(2,0)-P1(0,0),
u1.x*P1(2,2)-P1(0,2),
u1.y*P1(2,0)-P1(1,0),
u1.y*P1(2,2)-P1(1,2) );
u.x*P(2,1)-P(0,1),
u.y*P(2,1)-P(1,1),
u1.x*P1(2,1)-P1(0,1),
u1.y*P1(2,1)-P1(1,1),
-P(0,3)),
-(u.y*P(2,3)
-P(1,3)),
-(u1.x*P1(2,3) -P1(0,3)),
-(u1.y*P1(2,3) -P1(1,3)) );
Mat_<double> X;
solve(A, B, X, DECOMP_SVD);
return X;
}
Como se observa el mtodo recibe 4 parmetros, dos por cmara:
| ]
Esto es porque, la cmara izquierda con respecto a s misma, ni rota ni se mueve. Sin
embargo en el caso de la cmara derecha la matriz sera [R | T]. El cdigo para
generar la matriz de la cmara derecha sera el siguiente:
fsR.open("ster_extrinsics.yml", FileStorage::READ);
if(!fsR.isOpened())
cout<<"Fall al abrir el archivo de parmetros
extrnsecos.";
Mat R, T;
fsR["R"]>>R; //Matriz de rotacin.
fsR["T"]>>T; //Matriz de traslacin (vector).
88
Sin embargo los puntos u y u1 no son enviados como coordenadas en pixeles, sino
como coordenadas en funcin del punto central de la cmara, para esto
multiplicamos la inversa de la matriz de la cmara (parmetros intrnsecos, esta s es
la del apndice) que denotaremos como K, por el punto homogneo en cuestin. Esto
se realiza en dos pasos, primero recuperando los parmetros intrnsecos de las
cmaras y despus haciendo la multiplicacin de matrices:
FileStorage fsR;
fsR.open("ster_intrinsics.yml",FileStorage::READ);
if(!fsR.isOpened())
cout<<"Fall al abrir los parmetros intrnsecos de la
cmara Izquierda";
fsR["M1"]>>KI;
fsR["M2"]>>KD;
KIinv = KI.inv();
KDinv = KD.inv();
Donde KI y KD son de tipo Mat, al igual que KIinv y KDinv.
Recuperados los
corresponden al mismo punto fsico. Para ello deben crearse dos mtodos que se
vincularn con las ventanas en las que se muestran las imgenes. Esto se logra con el
mtodo cvSetMouseCallback, cuya sintaxis es:
cvSetMouseCallback("ImgIzq", onMouseIzq, NULL);
As, cuando se presione clic en la ventana ImgIzq, se ejecutar el mtodo
onMouseIzq() que ser de nuestra creacin.
A continuacin el cdigo que recupera las coordenadas en pixeles del punto
89
90
91
92
93
6.7 MEDICIN
Si se crean mtodos para seleccionar otro punto en el mismo par de fotografas
pueden realizarse mediciones, con la raz de las diferencias al cuadrado de las
coordenadas (como se muestra en el cdigo) obtenemos resultados como el mostrado
en la Figura 67.
94
95
APNDICE A.
96
Una vez colocado el OpenCV en la carpeta de nuestra preferencia crearemos una variable
del sistema, esto es una especie de acceso directo que podremos usar desde Visual Studio
C++ para referirnos a la carpeta donde se encuentran las libreras de OpenCV. Al declarar
una variable del sistema, si en el futuro cambiamos la ubicacin de nuestras libreras solo
tendremos que modificar la variable del sistema en lugar de volver a indicar en cada uno de
nuestros proyectos de C++ la ubicacin de las libreras.
Para hacerlo abrimos una instancia de smbolo del sistema como administradores
97
98
99
100
101
102
103
Se nos mostrar una ventana como la de arriba (esta es la versin Express 2010 de Visual
C++)
104
105
Damos clic derecho en el nombre de nuestro proyecto, en este caso Ejemplo1 y clic en
Propiedades.
106
107
108
En este punto cabe aclarar que VS C++, al momento de compilar genera cdigo en dos
variantes Debug y Release. En la modalidad Debug el cdigo es ms apto para realizar
correcciones, puntos de interrupcin y las tareas necesarias durante el desarrollo. En la
modalidad Release el cdigo se optimiza ya sea en tiempo de ejecucin, en tamao o en
ambas, puesto que es una versin que se va a liberar.
109
110
opencv_legacy242.lib
opencv_flann242.lib
Como puede observarse estos elementos no tienen la d al final del nombre, lo que denota
en aquellos que son libreras para utilizarse en el modo Debug.
111
112
BIBLIOGRAFA
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
113
[10] Lam L., Lee S. W., Suen Ch. Y., (1992) Thinning Methodologies A
IEEE transactions on systems, man and cybernetics, 9(1),, (2006), Pg. 6266, 1979.
[12] Pajares G. y De la Cruz J. (2002), Visin por computador, imgenes
OReilly.
[20] http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencvfrom-harley-zisserman-w-code/
114
115