Calibración de cámara-calibración de parámetros externos kinectv1 (epnp)

ilustrar

1. Calibración de parámetros externos kinectv1
2. Use la función epnp de Opencv para realizar
3. Programación Python

1. Requisitos de calibración

Las coordenadas de píxeles (u, v) se obtienen de acuerdo con la cámara a color de kinectv1, y el Zc correspondiente a (u, v) en el sistema de coordenadas de la cámara se obtiene a través de la cámara de profundidad de kinectv1, y luego las coordenadas del mundo real de la punto se restauran de acuerdo con los parámetros internos y externos obtenidos de la cámara.
Si no tenemos información de profundidad, solo podemos calcular las coordenadas mundiales del avión y no se puede restaurar el valor real de Z. Lea este blog , que incluye el principio de calibración de la cámara y la relación y el significado práctico de cada sistema de coordenadas involucrado en calibración.

2. Introducción a la cámara

introducción de la cámara kinect

El significado real de la información de profundidad es la distancia vertical desde el punto hasta el plano del eje óptico de la cámara, es decir, el valor Zc en el sistema de coordenadas de la cámara.

3. Calibración de referencia interna

La calibración de los parámetros internos de la cámara Kinect
se puede realizar con archivos de calibración de color en uso real

4. Método de calibración

1. Principios y artículos prácticos relacionados

Use el método pnp para la calibración. Hay muchos principios de calibración pnp en Internet. Creo que el principio de este artículo es bastante bueno y creo que la aplicación de este artículo es muy buena.
Próximo catálogo:
"Estimación de pose de cámara 0: Principios básicos para resolver problemas de PNP"
"Estimación de pose de cámara 1: Estimación de pose de cámara basada en cuatro puntos característicos"
"Estimación de pose de cámara 1_1: OpenCV:solvePnP Empaquetado secundario y prueba de rendimiento"
"Posición de cámara Estimación 2: [Aplicación] Estimación de pose en tiempo real y Reconstrucción 3D Pose de cámara" "
Estimación de pose de cámara 3: Encontrar las coordenadas mundiales de un punto en función de los resultados de estimación de pose de dos imágenes" ¿Para
qué es la solución pnp? Necesita 4 pares de coordenadas: el método de interpretación de imágenes geométricas más popular

2. La función de calibración pnp solvepnp en opencv

retval1, rvec1, tvec1=cv.solvePnP(world_point,pixel_point,K,distortion_coefficients)

Los parámetros de esta función se ingresan en orden de coordenadas mundiales, coordenadas de píxeles, matriz de referencia interna, matriz de distorsión y el número de iteraciones. El último
parámetro del método tiene los siguientes tres tipos. El blogger usa solución iterativa y epnp. Ambos Los métodos pueden restaurar las coordenadas mundiales.La diferencia no es grande.

inserte la descripción de la imagen aquí

5. Experimento de calibración

La altura de la cámara es de 1 m por encima de la mesa, el plano del eje óptico y la mesa tienen un cierto ángulo de inclinación, y cada cuadrícula del tablero de ajedrez mide 4 cm.

1. Selección de puntos

Cuando utilice el método predeterminado, seleccione las cuatro esquinas de la siguiente figura como puntos de calibración.
Cuando use la calibración epnp, seleccione
el punto azul claro en la figura a continuación para el primer punto de control,
seleccione el punto azul para el segundo punto de control,
seleccione el punto rojo para el tercer punto de control y
seleccione el punto verde para el cuarto punto de control

La dirección de las coordenadas del mundo,
el escritorio vertical hacia arriba es la dirección positiva del eje Z,
el punto azul al punto rojo es la dirección negativa del eje Y,
y el punto azul al punto verde es la dirección positiva del eje x
inserte la descripción de la imagen aquí

2. código de llamada de función epnp (python)

# encoding: utf-8
import cv2 as cv
import numpy as np
import yaml
import os
import io
with open("file/rgb_A22593W01131223A.yaml", 'rb') as f:   #写入正确的文件路径
    data = yaml.load(f)
    camera_matrix = data['camera_matrix']['data']
    distortion_coefficients = data['distortion_coefficients']['data']

distortion_coefficients=np.array(distortion_coefficients)


K= np.zeros([3, 3], dtype=float)
# K=np.mat(K)

K[0,0]=camera_matrix[0]
K[0,1]=camera_matrix[1]
K[0,2]=camera_matrix[2]

K[1,0]=camera_matrix[3]
K[1,1]=camera_matrix[4]
K[1,2]=camera_matrix[5]
#
K[2,0]=camera_matrix[6]
K[2,1]=camera_matrix[7]
K[2,2]=camera_matrix[8]



pixel_point= np.array([
    [328.0, 172.0],
    [158.0, 58.0],
    [137.0, 310.0],
    [508.0, 55.0]
                            ])
world_point= np.array([
                            [360.0, -280.0, 90.0],
                             [0.0, 0.0, 0.0],
                             [0.0, -520.0, 0.0],
                            [720.0, 0.0, 0.0]
                            ])

retval1, rvec1, tvec1=cv.solvePnP(world_point,pixel_point,K,distortion_coefficients, useExtrinsicGuess=1, flags=cv.SOLVEPNP_EPNP)
r1 = cv.Rodrigues(rvec1,jacobian=0)
print(r1[0])
print(tvec1)

3. Análisis de resultados

(1) Coordenadas de píxeles y coordenadas reales

pixel_point= np.array([
    [328.0, 172.0],
    [158.0, 58.0],
    [137.0, 310.0],
    [508.0, 55.0]
                            ])
world_point= np.array([
                            [360.0, -280.0, 90.0],
                             [0.0, 0.0, 0.0],
                             [0.0, -520.0, 0.0],
                            [720.0, 0.0, 0.0]
                            ])

(2) Matriz de parámetros externos

[[ 9.98539408e-01  1.49732959e-02 -5.19119596e-02 -3.28108974e+02]
 [ 3.34250968e-03 -9.76109922e-01 -2.17251577e-01 -3.78811896e+02]
 [-5.39247510e-02  2.16760745e-01 -9.74734272e-01  1.18536981e+03]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  1.00000000e+00]]

(3) Resultados del cálculo

Para la verificación de cuatro puntos de control y dos puntos arbitrarios, el valor de profundidad obtenido por la propia cámara se compensa en 7 cm.
coordenadas de dos puntos arbitrarios

720,-520, 0
200,-80,25

resultado

[[ 3.59876941e+02 -5.67379331e-01 -7.67101745e+00  7.19528649e+02 7.25095153e+02  2.00069031e+02]
 [-2.80541796e+02  7.66719036e-01 -5.24430480e+02 -7.01423857e-01 -5.22356724e+02 -8.39731426e+01]
 [ 9.35158355e+01  1.39182581e+01 -6.04520752e+00  8.63555196e+00 -9.18937150e+00  2.29591386e+01]
 [ 1.00000000e+00  1.00000000e+00  1.00000000e+00  1.00000000e+00 1.00000000e+00  1.00000000e+00]]

El error está dentro de un centímetro.

Supongo que te gusta

Origin blog.csdn.net/puqian13/article/details/108504193
Recomendado
Clasificación