Está en la página 1de 8

INSTITUTO POLITÉCNICO NACIONAL

CENTRO DE INVESTIGACIÓN EN CIENCIA APLICADA Y TECNOLOGÍA


AVANZADA

ANÁLISIS DE IMÁGENES

PRÁCTICA # 1
OBTENER LOS PÁRAMETROS INTRÍNSECOS DE UNA CÁMARA

PRESENTA: NICOLÁS CRUZ SANTOS


MAESTRÍA EN TECNOLOGÍA AVANZADA
Objetivo: Extraer los parámetros intrínsecos de una cámara, después hacer la
relación entre pixeles y el mundo real y obtener las dimensiones de un objeto
cualquiera.
Procedimiento:
Mediante el uso de Matlab, vamos a obtener los parámetros intrínsecos de una
cámara usando la teoría vista en clase. Como primer paso es necesario fijar la
cámara y usar un patrón para hacer la calibración.

Distancia
establecida
La cámara
está fija

Se toman varias imágenes del patrón para hacer la calibración, y después (sin
mover la cámara) se coloca el objeto u objetos que se utilizarán para medir. Las
imágenes que se utilizaron se pueden observar abajo (ver imágenes).

Imagen del patrón.


Imagen del objeto a medir

El segundo paso es utilizar el detector de Harris para obtener las esquinas del
patrón, de esta forma vamos a obtener seis puntos, tres en la dirección de las X, y
tres en dirección de las Y. Los puntos obtenidos son los siguientes:

%NOTA: no se toman los primeros 2 valores porque el detector de Harris


%detecto dos esquinas fuera del patrón

u1=143; v1=367;
u2=158; v2=368;
u3=174; v3=368;
u4=144; v4=382;
u5=144; v5=401;
u6=144; v6=415;

Ahora establecemos la medida del patrón, en el cual cada cuadro tiene una
dimensión de 2 mm y vamos a considerar que Z=0;
x1=0; y1=0; %MEDIDA DEL PATRÓN EN X, Y, Z
x2=0; y2=2;
x3=0; y3=4;
x4=2; y4=0;
x5=4; y5=0;
x6=6; y6=0;

z=0;

Usando la teoría vista en clase vamos a formar la Matriz A, el vector b de la siguiente


forma:

A= [x1 y1 z 1 0 0 0 0 -u1*x1 -u1*y1 -u1*z;


0 0 0 0 x1 y1 z 1 -v1*x1 -v1*y1 -v1*z;
x2 y2 z 1 0 0 0 0 -u2*x2 -u2*y2 -u2*z;
0 0 0 0 x2 y2 z 1 -v2*x2 -v2*y2 -v2*z;
x3 y3 z 1 0 0 0 0 -u3*x3 -u3*y3 -u3*z;
0 0 0 0 x3 y3 z 1 -v3*x3 -v3*y3 -v3*z;
x4 y4 z 1 0 0 0 0 -u4*x4 -u4*y4 -u4*z;
0 0 0 0 x4 y4 z 1 -v4*x4 -v4*y4 -v4*z;
x5 y5 z 1 0 0 0 0 -u5*x5 -u5*y5 -u5*z;
0 0 0 0 x5 y5 z 1 -v5*x5 -v5*y5 -v5*z;
x6 y6 z 1 0 0 0 0 -u6*x6 -u6*y6 -u6*z;
0 0 0 0 x6 y6 z 1 -v6*x6 -v6*y6 -v6*z]; %MATRIZ A

b= [u1; v1; u2; v2; u3; v3; u4; v4; u5; v5; u6; v6]; % VECTOR b

sabemos que:
𝐀𝐦 = 𝐛

Entonces necesitamos obtener la matriz m de la siguiente forma:

m=pinv(A)*b
%m=inv(A'*A)*A'*b

El resultado es el siguiente:
m =

0.5246
4.1406
0.0000
143.3000
9.1970
-7.1373
0.0000
366.8744
0.0026
-0.0203
0

m11 = 0.5246
m12 = 4.1406
m13 = 1.3480e-12
m14 = 143.3000
m21 = 9.1970
m22 = -7.1373
m23 = 4.1448e-14
m24 = 366.8744
m31 = 0.0026
m32 = -0.0203
m33 = 0

Ahora vamos a crear el programa para medir el objeto, primero vamos a obtener
puntos para posteriormente tomar distancias, entonces pasamos de pixeles a mm
usando una lógica como se muestra en la figura:

El primer paso es nuevamente usar el detector de Harris para obtener los puntos de
interés del objeto que necesitamos medir, vamos a obtener nuevamente
coordenadas en pixeles que después transformaremos en milímetros, el programa
nos detecta las siguientes esquinas (ver imagen):
Los puntos de interés son los siguientes:

%x columna, y fila
%Puntos de interés del objeto

u1=358; v1=180;
u2=400; v2=218;
u3=360; v3=201;
u4=420; v4=179;
u5=429; v5=202;
u6=439; v6=219;
u1, v1 9 mm u4, v4
Usando la matriz m calculada anteriormente, vamos a escribirla de la siguiente
forma:

m = [m11 m12 m13 m14 m21 m22 m23 m24 m31 m32 m33 1];

De las siguientes ecuaciones:


𝑠𝑢 = 𝑚11 ∗ 𝑥 + 𝑚12 ∗ 𝑦 + 𝑚13 ∗ 𝑧 + 𝑚14
𝑠𝑣 = 𝑚21 ∗ 𝑥 + 𝑚22 ∗ 𝑦 + 𝑚23 ∗ 𝑧 + 𝑚24
𝑠 = 𝑚31 ∗ 𝑥 + 𝑚32 ∗ 𝑦 + 𝑚33 ∗ 𝑧 + 1

Resolviendo el sistema de ecuaciones anterior, obtenemos lo siguiente para los puntos u1,v1 y
u4,v4:
g1=((m(1,7)*z+m(1,8)-(m(1,11)*z+1)*v1)*(m(1,1)-m(1,9)*u1))/((m(1,9)*v1-
m(1,5))*(m(1,10)*u1-m(1,2)));
f1=(m(1,3)*z+m(1,4)-(m(1,11)*z+1)*u1)/(m(1,10)*u1-m(1,2));
b1=((m(1,6)-m(1,10))*(m(1,1)-m(1,9)*u1))/((m(1,9)*v1-
m(1,5))*((m(1,10)*u1-m(1,2))));

y1=(g1+f1)/(1-b1)
x1=(y1*(m(1,6)-m(1,10))+m(1,7)*z+m(1,8)-(m(1,11)*z+1)*v1)/(m(1,9)*v1-
m(1,5))

g4=((m(1,7)*z+m(1,8)-(m(1,11)*z+1)*v4)*(m(1,1)-m(1,9)*u4))/((m(1,9)*v4-
m(1,5))*(m(1,10)*u4-m(1,2)));
f4=(m(1,3)*z+m(1,4)-(m(1,11)*z+1)*u4)/(m(1,10)*u4-m(1,2));
b4=((m(1,6)-m(1,10))*(m(1,1)-m(1,9)*u4))/((m(1,9)*v4-
m(1,5))*((m(1,10)*u4-m(1,2))));

y4=(g4+f4)/(1-b4)
x4=(y4*(m(1,6)-m(1,10))+m(1,7)*z+m(1,8)-(m(1,11)*z+1)*v4)/(m(1,9)*v4-
m(1,5))

El programa nos arroja los siguientes resultados:


y1 = 7.5743
x1 = -1.4047
y4 = 6.1297
x4 = 5.9588

Calculando la distancia entre dos puntos para x, tenemos lo siguiente:

𝑑 = √(𝑥1 − 𝑥4 )2 + (𝑦1 − 𝑦4 )2
El resultado es:
d =7.5039

Con lo cual podemos decir que nuestra calibración tiene un error de aproximadamente 1.5mm, ya
que la distancia (como se aprecia en la figura anterior) es de 9 mm.

El código que se utilizó en Matlab, se puede encontrar en los archivos adjuntos.

También podría gustarte