Comprensión profunda de la calibración de la cámara halcon

  • Escribir en Blogger no es fácil, todavía necesita su apoyo
  • Miles de aguas y miles de montañas siempre están enamoradas, así que primero haga clic en Me gusta.

Recientemente, algunas personas me escribieron en privado y me dijeron que después de leer mi "Referencia externa de la cámara de referencia interna de la cámara de calibración de la cámara HALCON" https://blog.csdn.net/cashmood/article/details/100089295, todavía hay algunas cosas que no entiendo, aquí Brinde a todos un tutorial detallado.

Introducción a la calibración de la cámara

En primer lugar, la lente está distorsionada, es decir, la imagen que se fotografía no se corresponde con la situación real. Incluso las lentes industriales tienen una tasa de distorsión de unas milésimas.
La última imagen le informa sobre la distorsión. En
Inserte la descripción de la imagen aquí
esta imagen, la primera imagen es la forma real debajo de nuestra cámara y las dos siguientes son las imágenes distorsionadas.

En segundo lugar, la lente y la cámara, no importa cuán alta sea la precisión de su estructura mecánica, no es fácil o imposible instalar la cámara de una manera particularmente correcta. Una instalación incorrecta de la cámara también causará errores. Si quieres conocer el modelo matemático específico, puedes buscar los conocimientos teóricos de calibración de cámaras, me enfocaré en cómo hacerlo.
La calibración es convertir las dos cosas anteriores en normal.
Ya sea en la medición de imágenes o en aplicaciones de visión artificial, la calibración de los parámetros de la cámara es un vínculo muy crítico. La precisión de los resultados de la calibración y la estabilidad del algoritmo afectan directamente la precisión de los resultados producidos por la cámara.

Descripción detallada

1. Introducción a los parámetros de calibración de la cámara

Inserte la descripción de la imagen aquí
Parámetros internos: determinan la relación de proyección de la cámara desde el espacio tridimensional al espacio bidimensional.
El modelo de cámara estenopeica (cámara con lente FA) tiene 6 parámetros (f, kSx, Sy, Cx, Cy); el modelo de cámara con lente telecéntrica tiene 5 parámetros (f, Sx, Sy, Cx, Cy); la cámara de escaneo de línea es 11 parámetros (f, k, Sx, Sy, Cx, Cy, Width, Highth, Vx, Vy, Vz).
Entre ellos:
f es la distancia focal;
k es el nivel de distorsión radial. Si k es negativo, la distorsión se convierte en una distorsión de barril, si es positivo, entonces la distorsión se convierte en una distorsión de acerico.
Sx, Sy son factores de escala. Para una cámara estenopeica (lente FA), representa la distancia entre píxeles adyacentes en las direcciones horizontal y vertical del sensor de imagen. Cuanto más cerca esté el valor inicial del valor real, más rápida será la velocidad de cálculo. Para el modelo de cámara telecéntrica, representa el tamaño del píxel en el sistema de coordenadas mundial.
Cx, Cy son los puntos principales de la imagen. Para una cámara estenopeica, este punto es la proyección vertical del centro de proyección en el plano de imagen, y también es el centro de distorsión radial. Para el modelo de cámara telecéntrica, solo se representa el centro de distorsión.
Vx, Vy, Vz: la cámara de escaneo de línea debe moverse en relación con el objeto para poder capturar una imagen útil. Este es el vector de movimiento. Sx y Sy son las distancias horizontal y vertical de píxeles adyacentes para cámaras de escaneo de línea.

2. Introducción detallada de la placa de calibración

Pregunta 1: ¿Halcon solo puede utilizar placas de calibración específicas de Halcon?

Halcon proporciona operadores de calibración simples y precisos y asistentes de calibración, lo que facilita enormemente a los usuarios en el uso real
. Hay dos métodos de calibración en halcon:
las propias rutinas de halcon aparecen en el tablero de calibración definido por halcon, Como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
tablero de calibración definido por el usuario, el usuario puede hacer cualquier forma y forma de tablero de calibración, como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
Por lo tanto, halcon no solo puede usar un tablero de calibración dedicado, sino que también puede usar un tablero de calibración personalizado para realizar la calibración.

Pregunta 2: ¿Cómo generar la placa de calibración halcon?

Utilice el operador gen_caltab para hacer una placa de calibración
gen_caltab (:: XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile :) XNum:
el número de puntos de marca negra en cada fila
YNum: el número de puntos de marca negra en cada columna
MarkDist: dos La distancia entre los centros de los puntos negros más cercanos, la unidad es m
DiameterRatio: la relación entre el diámetro de los puntos negros y la distancia entre los centros de los dos puntos
CalPlateDescr: la ruta del archivo de descripción de la placa de calibración
CalPlatePSFile: la ruta del archivo de imagen de la placa de calibración, puede abrir el
ejemplo con ps :
gen_caltab (7, 7, 0.1, 0.5, 'caltab.descr', 'caltab.ps')
Puede pensar usted mismo en el significado de cada parámetro.
Número de filas: 7
Número de columnas: 7
Radio de punto negro:
centro de punto de 0,05 m Espaciado: 0,1 m

Pregunta 3: ¿Cómo colocar la placa de calibración halcon? ¿Existe un límite en la cantidad de fotos tomadas?

No es que cuanto mayor sea el número de calibraciones de la cámara, mayor será la precisión que se puede lograr. Halcon recomienda que el número de disparos sea de 9 a 16 y también hace sugerencias para la ubicación. La placa de calibración ocupa 1 / 3-1 / 4 del campo de visión de calibración, y el valor de gris de la imagen de la placa de calibración debe ser superior a 128 para una extracción suave. Como se muestra abajo:
Inserte la descripción de la imagen aquí

Pasos de calibración

Tenga en cuenta que solo se introduce la cámara de escaneo de área, otras cámaras son idealmente iguales que el canal de escaneo de área.

1. Establecer el valor inicial de la cámara

Utilice el operador set_calib_data_cam_param para establecer el valor inicial interno de la cámara

set_calib_data_cam_param (:: CalibDataID, CameraIdx, CameraType, CameraParam :)
CalibDataID: asa de calibración
CameraIdx: número de serie de la cámara
CameraType: tipo de modelo de cámara; cámara de escaneo de área Modelo de distorsión de división'area_scan_division '; modelo de distorsión polinomial'area_scan_polynomial'. . . . . .
CameraParam: los parámetros correspondientes al modelo de la cámara; el modelo de distorsión de división de la cámara de exploración de área 'área_scan_division' ([Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]); el modelo de distorsión polinomial'area_scan_polynomial '([Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]). . . . . .

La tabla correspondiente de tipos de modelo de cámara y parámetros de cámara:
Inserte la descripción de la imagen aquí

Habilidades de selección de tipo de distorsión y determinación de parámetros

El modelo de distorsión por
división de selección del modelo de distorsión solo es adecuado para casos de baja precisión donde el número de imágenes de calibración es pequeño: el
modelo de distorsión polinomial corrige las distorsiones radiales y tangenciales, con alta precisión y mucho tiempo.
Habilidades de determinación de parámetros El
enfoque representa la distancia focal, complete de acuerdo con los parámetros de nuestra lente y complete 0 para lente telecéntrica

Kappa es el tamaño de distorsión, porque antes de la calibración, 0 se completa por defecto

El ancho y el alto de Sx, Sy pixel completan el tamaño de pixel de la cámara. Puede consultar el manual de la cámara o consultar al fabricante de la cámara.
Cx, Cy rellenan las coordenadas centrales de la imagen
ImageWidth, ImageHeight rellenan el ancho y el alto de la imagen

2. Inicialice la placa de calibración

Utilice el operador set_calib_data_calib_object
por ejemplo:
CaltabDescr: = 'caltab_100mm.descr'
set_calib_data_calib_object (CalibDataID, 0, CaltabDescr)
Esto es relativamente simple, puede entenderlo leyendo la ayuda, así que no lo presentaré.

3. Cree un modelo de datos de calibración

Utilice el operador create_calib_data (:: CalibSetup, NumCameras, NumCalibObjects: CalibDataID)
CalibSetup: contenido creado
NumCameras: número de cámaras
NumCalibObjects: número de elementos de calibración
CalibDataID: asa de calibración
Por ejemplo:
create_calib_data ('calibración_object', 1, 1, CalibDataID)

4. Obtenga imágenes de calibración

La placa de calibración es cuadrada, el tamaño es 1/3 del ancho del área a irradiar, la cámara toma o lee 9-16 fotografías, la placa de calibración intenta cubrir todo el campo de visión al tomar fotografías; el diámetro de los puntos de la placa de calibración no puede ser menor de 10 píxeles .

5. Utilice la imagen para calibrar los parámetros internos de la cámara y obtener el resultado.

Método 1:
use la imagen de calibración, use directamente halcon para automatizar completamente la calibración
find_calib_object (Image, CalibDataID, CameraIndex, 0, PoseIndex, [], []) para
obtener los datos de calibración
get_calib_data (CalibDataID, 'camera', 0, 'type', CameraType)

Método 2:
1. Busque el área de la placa de calibración, determine el centro del círculo y cargue el resultado en el componente
find_caltab (Imagen: CalPlate: CalPlateDescr, SizeGauss, MarkThresh, MinDiamMarks
:) find_marks_and_pose (Image, CalPlateRegion :: CalPlateDescr, StartCamParam, StartThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks: RCoord, CCoord, StartPose)
set_calib_data_observ_points (:: CalibDataID, CameraIdx, CalibObjIdx, CalibObjPoseIdx, Row, Column, Index, Pose
:) Principio: Primero busque el filtro Size_Ga de la imagen ), y luego la segmentación del umbral (el tamaño del umbral es MarkThresh) para averiguar el área de la placa de calibración; el operador find_marks_and_pose divide el círculo en el área, encuentra el número de círculos, perímetro, coordenadas, etc.debe ser consistente con el archivo de descripción de la placa de calibración , De lo contrario, ajustará automáticamente StartThresh para que StartThresh se reduzca a MinDiamMarks de acuerdo con la longitud del paso DeltaThresh hasta que se encuentre el centro exacto del círculo.
2. Realice la calibración
calibrate_cameras (:: CalibDataID: Error) y
devuelva el error de proyección promedio Error

6. Utilice la imagen para calibrar los parámetros externos de la cámara y obtener el resultado.

Parámetros externos de la cámara: determina la relación de posición relativa entre el sistema de coordenadas de la cámara y el sistema de coordenadas del mundo,
donde Pw es la coordenada del mundo, Pc es la coordenada de la cámara, T = (Tx, Ty, Tz) es el vector de traslación, R = (a, b, r) Es la matriz de rotación, el ángulo de rotación alrededor del eje Z del sistema de coordenadas de la cámara es r; el ángulo de rotación alrededor del eje Y del sistema de coordenadas de la cámara es b; el ángulo de rotación alrededor del eje X del sistema de coordenadas de la cámara es a. 6 parámetros forman los parámetros externos de la cámara (a, b, r, Tx, Ty, Tz)
y satisfacen la siguiente fórmula:
Pc = R * Pw + T

具体 步骤:
set_calib_data_cam_param (:: CalibDataID, CameraIdx, CameraType, CameraParam :)
set_calib_data_calib_object (:: CalibDataID, CalibObjIdx, CalibObjDescr :)
find_calib_object (Imagen :: CalibDataID, CameraIdxPaxVoseal_object
: CalibDataID, ContourName, CameraIdx, CalibObjIdx, CalibObjPoseIdx :)
get_calib_data_observ_points (:: CalibDataID, CameraIdx, CalibObjIdx, CalibObjPoseIdx: Fila, Columna, Índice, Pose)
set_origin
Inserte la descripción de la imagen aquí

Análisis y código de calibración de la cámara Halcon

**创建标定板
gen_caltab(7,7,0.008,0.5,'48_48mm.descr','48_48mm.ps')
           
*=======标定内参
dev_close_window ()
dev_open_window (0, 0, 652, 494, 'black', WindowHandle)
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (3)
OpSystem := environment('OS')
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
           
*标定相机
StartCamPar := [0.0,0.0,0.0000299,0.0000299,4896/2,3264/2,4896,3264]
create_calib_data ('calibration_object', 1, 1, CalibDataID)
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_telecentric_division', StartCamPar)
set_calib_data_calib_object (CalibDataID, 0, '48_48mm.descr')
           

for index := 1 to 13 by 1
    read_image (Image, '标定20/' + index + '.png')
    get_image_size(Image, Width, Height)
    dev_display (Image)
    find_calib_object (Image, CalibDataID, 0, 0, index, [], [])
    get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, index)
    dev_set_color ('green')
    dev_display (Caltab)
endfor
           
calibrate_cameras (CalibDataID, Error)
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)
get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', PoseCalib)
           
*输出计算的相机内参
write_cam_par (CamParam, 'camera_parameters.dat')
           
           
Message:= '相机内参已经写入文件中'
disp_message (WindowHandle, Message, 'window', 12, 12, 'red', 'false')
clear_calib_data (CalibDataID)
stop()
           
           
*=====标定外参
dev_set_draw ('margin')
dev_set_line_width (1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
           
*从文件中读取内参 存储文件:camera_parameters.dat
try
    read_cam_par ('camera_parameters.dat', CamParam)
catch (Exception)
    stop ()
endtry
           
*开始计算
open_file('data.csv','output', FileHandle)
fwrite_string(FileHandle,'Dis_pix*0.0299204,Dis_m*1000,Distance')
fnew_line (FileHandle)
close_file(FileHandle)
           
*选择一张作为标定作为最终标定位姿(任意一张都可以)
index:=1
read_image (Image,'标定20/'+index+'.png')
dev_display (Image)
CaltabName := '48_48mm.descr'
create_calib_data ('calibration_object', 1, 1, CalibDataID)

set_calib_data_cam_param (CalibDataID, 0, 'area_scan_telecentric_division', CamParam)
set_calib_data_calib_object (CalibDataID, 0, CaltabName)
find_calib_object (Image, CalibDataID, 0, 0, 1, [], [])
get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, 1)
get_calib_data_observ_points (CalibDataID, 0, 0, 1, RCoord, CCoord, Index, PoseForCalibrationPlate)
dev_set_color ('green')
dev_display (Caltab)
dev_set_color ('red')
disp_caltab (WindowHandle, CaltabName, CamParam, PoseForCalibrationPlate, 1)
dev_set_line_width (1)
disp_circle (WindowHandle, RCoord, CCoord, gen_tuple_const(|RCoord|,1.5))
* caltab_points (CaltabName, X, Y, Z)
* calibrate_cameras (CalibDataID, Error)
* To take the thickness of the calibration plate into account, the z-value
* of the origin given by the camera pose has to be translated by the
* thickness of the calibration plate.
* Deactivate the following line if you do not want to add the correction.
set_origin_pose (PoseForCalibrationPlate, 0, 0, 0, PoseCalib)
* disp_continue_message (WindowHandle, 'black', 'true')
* stop ()
           
*像素距离
distance_pp(RCoord[0],CCoord[0],RCoord[48],CCoord[48], Dis_pix)
*像素直接转换mm然后计算
pix2mm(RCoord, CCoord,CamParam[2],CamParam[3],newCol,newRow)
distance_pp(newRow[0],newCol[0],newRow[48],newCol[48], Dis_m)
*用同一个世界坐标系来计算
image_points_to_world_plane(CamParam, PoseCalib,[RCoord[0],RCoord[48]], [CCoord[0],CCoord[48]], 'mm', X1, Y1)
distance_pp(Y1[0],X1[0],Y1[1],X1[1],Distance)
           
*输出计算结果比较
open_file('data.csv','append', FileHandle)
fwrite_string(FileHandle, Dis_pix*0.0299+','+Dis_m*1000+','+Distance+'\n')
close_file(FileHandle)    
           
Message:= '计算完毕'
disp_message (WindowHandle, Message, 'window', 12, 12, 'red', 'false')
stop()

Este documento es compartido y organizado por http://www.ihalcon.com/read-7598.html.

  • Sobre el blogger:
  • Ingeniero de software superior de automatización industrial, ingeniero de algoritmos de visión artificial, ingeniero de algoritmos de control de movimiento. Actualmente trabaja en la industria de automatización de fabricación inteligente. Buzón de Blogger: [email protected]
  • Ayúdame a que me guste. Jaja.

Supongo que te gusta

Origin blog.csdn.net/cashmood/article/details/105221053
Recomendado
Clasificación