Autocalibración Halcon para corrección de distorsión

1. Halcon tiene un operador que puede usar una sola imagen para calibrar los parámetros internos de la cámara para corregir la distorsión. Sin embargo, existen requisitos para la imagen, porque cuanto más cerca esté la distorsión del borde de la imagen, más grave será. Por lo tanto, se requiere que haya suficientes líneas rectas alrededor de la imagen y es mejor tener suficientes líneas rectas en el medio de la imagen. Estas líneas rectas se extraen y, después de la calibración posterior, estas líneas rectas distorsionadas se enderezarán para lograr la corrección de la distorsión. Esta función es similar a la calibración de CheckBoard en Visionpro, excepto que después de la calibración de CheckBoard, las coordenadas de píxeles se pueden convertir directamente a coordenadas mundiales y la imagen convertida se puede generar directamente en mm para la medición. Sin embargo, después de calibrar el operador de autocalibración Halcon, solo se puede usar para corregir la distorsión. Si necesita usarse para convertir a coordenadas mundiales, debe calcular el equivalente en píxeles.
2. Explicación detallada del operador
2.1 radial_distortion_self_calibration (Contornos: Contornos seleccionados: Ancho, Altura, Umbral interno, RandSeed, Modelo de distorsión, Centro de distorsión, Var de punto principal: Parámetro de cámara)

Nombre: Autocalibración de distorsión radial
Descripción: Este operador utiliza los datos del perfil XLD para estimar los parámetros de distorsión y el centro de distorsión de la lente. Incluso los parámetros obtenidos se devuelven a través del parámetro interno CameraParam de la cámara. Este operador no puede corregir la distancia focal ni los factores de escala, por lo que no se puede utilizar en mediciones 3D.

Parámetros:
Contornos: entrada de datos de contorno para corrección
SelectedContours: datos de contorno corregidos
Ancho: ancho de imagen de los datos de contorno obtenidos
Altura: altura de la imagen de los datos de contorno obtenidos
InlierThreshold: umbral de clasificación
RandSeed: semilla aleatoria
DistortionModel: modo de distorsión
DistortionCenter: modo de estimación del centro de distorsión, que determina el método para estimar el centro de distorsión. Hay 'variable' (predeterminado, adecuado para los bordes de la imagen con muchos contornos o la distorsión debe ser alta. De lo contrario, se puede producir una mala postura al encontrar el centro de distorsión, lo que genera inestabilidades). malas posiciones.) PrincipalPointVar: control de desviación, controla la desviación entre el centro de distorsión y el centro de la imagen CameraParam: parámetros internos de la cámara de
salida

2.2 change_radial_distortion_cam_par( : : Modo, CamParamIn, DistortionCoeffs : CamParamOut)

Nombre: Parámetros de corrección de distorsión
Descripción: De acuerdo con el coeficiente de distorsión radial especificado, encuentre los parámetros internos ideales de la cámara sin distorsión.
parámetro:

Mode: modo de distorsión
CamParamIn: parámetros internos de la cámara distorsionados
DistortionCoeffs: valor del coeficiente de distorsión
CamParamOut: parámetros internos de la cámara corregidos

2.3 change_radial_distortion_image(Image, Region: ImageRectified: CamParamIn, CamParamOut: )
Nombre: corrige la imagen distorsionada
Descripción: corrige la distorsión de la imagen de entrada de acuerdo con la imagen especificada y los parámetros de adición especificados. change_radial_distortion_image cambia la distorsión radial de la imagen de entrada según los parámetros internos de la cámara CamParamIn y CamParamOut. Use CamParamOut para convertir cada píxel de la imagen de salida que se encuentra dentro de la región de la región en un plano de imagen, luego use CamParamIn para proyectarlo como un subpíxel de la imagen. El valor de gris resultante se determina por interpolación bilineal. Si el subpíxel está fuera de la imagen, el píxel correspondiente en la reconstrucción de la imagen se establece en "negro" y se elimina del dominio de la imagen.

Parámetros:
Imagen: Imagen de entrada
Región: Área de imagen corregida
ImageRectified: Imagen corregida CamParamIn: Parámetros de cámara de entrada CamParamOut
: Parámetros de cámara de salida 3. Caso 3.1 Caso oficial Halcon





*这个程序展示了如何radial_distortion _selfcalibration可以用来
*校准径向畸变系数和中心
*扭曲。在程序的第一部分,从边缘提取
*一个图像用于校准。结果表明
*径向畸变提取相当准确的从单一
*图像。为了提高准确性,程序的第二部分显示
*如何从20张图像中提取的边缘可以用来执行
*校准。因为这些边出现在很多不同的方向
* 20张图片,主点可以确定的明显更多
*准确。
dev_update_off ()
read_image (Image, 'board/board-01')
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
disp_message (WindowHandle, 'Image with radial distortions', 'window', 0, 0, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Extract subpixel-precise edges using the Canny filter.
edges_sub_pix (Image, Edges, 'canny', 1, 10, 40)
* Segment the edges into lines and circular arcs.
segment_contours_xld (Edges, SplitEdges, 'lines_circles', 5, 4, 2)
* Select edges that are long enough to be useful for the calibration.
select_shape_xld (SplitEdges, SelectedEdges, 'contlength', 'and', 30, 100000)
dev_display (Image)
dev_set_colored (12)
dev_display (SelectedEdges)
disp_message (WindowHandle, 'Extracted edges', 'window', 0, 0, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_clear_window ()
disp_message (WindowHandle, 'Performing self-calibration...', 'window', 0, 0, 'black', 'true')
*执行径向畸变的自我校准。
radial_distortion_self_calibration (SelectedEdges, CalibrationEdges, 646, 492, 0.08, 42, 'division', 'variable', 0, CamParSingleImage)
*校正图像,即去除径向畸变。
get_domain (Image, Domain)
change_radial_distortion_cam_par ('fixed', CamParSingleImage, 0, CamParSingleImageRect)
change_radial_distortion_image (Image, Domain, ImageRectified, CamParSingleImage, CamParSingleImageRect)
* Display the distorted and undistorted image five times to visualize the
* differences between the images.
dev_display (Image)
dev_display (CalibrationEdges)
disp_message (WindowHandle, 'Edges used for calibration', 'window', 0, 0, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_display (ImageRectified)
disp_message (WindowHandle, 'Image without radial distortions', 'window', 0, 0, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Now perform the self-calibration using edges extracted from 20 images.
* The variable Edges will accumulate the edges extracted from the images.
gen_empty_obj (Edges)
for J := 1 to 20 by 1
    read_image (Image, 'board/board-' + J$'02d')
    * Extract subpixel-precise edges using the Canny filter.
    edges_sub_pix (Image, ImageEdges, 'canny', 1, 10, 40)
    * Segment the edges into lines and circular arcs.
    segment_contours_xld (ImageEdges, SplitEdges, 'lines_circles', 5, 4, 2)
    * Select edges that are long enough to be useful for the calibration.
    select_shape_xld (SplitEdges, SelectedEdges, 'contlength', 'and', 30, 100000)
    * Accumulate the edges.
    concat_obj (Edges, SelectedEdges, Edges)
    dev_display (Image)
    dev_set_colored (12)
    dev_display (SelectedEdges)
    disp_message (WindowHandle, 'Edges extracted from image ' + J$'d', 'window', 0, 0, 'black', 'true')
endfor
dev_clear_window ()
dev_set_colored (12)
dev_display (Edges)
disp_message (WindowHandle, 'Collected edges from multiple images', 'window', 0, 0, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_clear_window ()
disp_message (WindowHandle, 'Performing self-calibration...', 'window', 0, 0, 'black', 'true')
*执行径向畸变的自我校准。
radial_distortion_self_calibration (Edges, CalibrationEdges, 646, 492, 0.08, 42, 'division', 'variable', 0, CamParMultiImage)
dev_clear_window ()
dev_set_colored (12)
dev_display (CalibrationEdges)
disp_message (WindowHandle, 'Edges used for calibration', 'window', 0, 0, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*计算未失真图像的相机参数。
change_radial_distortion_cam_par ('fixed', CamParMultiImage, 0, CamParMultiImageRect)
for J := 1 to 20 by 1
    read_image (Image, 'board/board-' + J$'02d')
    get_domain (Image, Domain)
    *校正图像,即去除径向畸变。
    change_radial_distortion_image (Image, Domain, ImageRectified, CamParMultiImage, CamParMultiImageRect)
    * Display the distorted and undistorted image to visualize the
    * differences between the images.
    dev_display (Image)
    disp_message (WindowHandle, 'Image with radial distortions', 'window', 0, 0, 'black', 'true')
    wait_seconds (0.5)
    dev_display (ImageRectified)
    disp_message (WindowHandle, 'Image without radial distortions', 'window', 0, 0, 'black', 'true')
    wait_seconds (0.5)
endfor

Corrección de la distorsión XLD de la imagen original
inserte la descripción de la imagen aquí
utilizada
inserte la descripción de la imagen aquí
para la corrección de la distorsión Figura
inserte la descripción de la imagen aquí
3.2 Caso de escritura personal

dev_update_off ()
read_image (Image, 'C:/Users/Dell/Desktop/Halocn自标定畸变校正/畸变校正.jpg')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
disp_message (WindowHandle, 'Image with radial distortions', 'window', 0, 0, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Extract subpixel-precise edges using the Canny filter.
edges_sub_pix (Image, Edges, 'canny', 1, 10, 40)
* Segment the edges into lines and circular arcs.
segment_contours_xld (Edges, SplitEdges, 'lines_circles', 5, 4, 2)
* Select edges that are long enough to be useful for the calibration.
select_shape_xld (SplitEdges, SelectedEdges, 'contlength', 'and', 30, 100000)
dev_display (Image)
dev_set_colored (12)
dev_display (SelectedEdges)
disp_message (WindowHandle, 'Extracted edges', 'window', 0, 0, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_clear_window ()
disp_message (WindowHandle, 'Performing self-calibration...', 'window', 0, 0, 'black', 'true')
*名字:径向畸变自标定
*描述:此算子通过XLD轮廓数据来估算镜头的畸变参数和畸变中心。其获得的即便参数通过相机内参数CameraParam返回。
*此算子不能矫正焦距和比例因子,因此不能用于3D测量中。
*若相机模型为area(division),则相机参数为7个,若area(多项式),则相机参数12个。
*InlierThreshold值在0.010.5之间。值越小,精度越高,但是运算耗时长;值越大,越能容忍偏差。默认值0.05radial_distortion_self_calibration (SelectedEdges, CalibrationEdges, Width, Height, 0.08, 42, 'division', 'fixed', 0, CameraParam)
*名字:校正畸变参数
*描述:根据指定的径向畸变系数,求取理想无畸变的相机内参。
get_domain (Image, Domain)
change_radial_distortion_cam_par ('fixed', CameraParam, 0, CamParamOut)
*名字:校正畸变图像方法1
*描述:根据指定图像和指定相加参数来矫正输入图像的畸变。
change_radial_distortion_image (Image, Domain, ImageRectified, CameraParam, CamParamOut)
dev_display (Image)
dev_display (CalibrationEdges)

*校正畸变图像方法2,效果与方法1完全相同
gen_radial_distortion_map(Map, CameraParam, CamParamOut, 'bilinear')
map_image(Image, Map, ImageMapped)
dev_display (Image)
dev_display (ImageMapped)


*读写参数
* write_cam_par (CameraParam, 'D:/CameraParam.dat')
* write_cam_par (CamParamOut, 'D:/CamParamOut.dat')
* read_cam_par ('D:/CameraParam.dat', CameraParam1)
* read_cam_par ('D:/CamParamOut.dat', CamParamOut1)

imagen original
inserte la descripción de la imagen aquí

La imagen después de la corrección de distorsión XLD utilizada
inserte la descripción de la imagen aquí
para la corrección de distorsión Imagen
inserte la descripción de la imagen aquí
original La imagen después
inserte la descripción de la imagen aquí
de la corrección de distorsión XLD utilizada para la corrección de distorsión 4. Problemas encontrados Cuando se ejecuta la función radial_distortion_self_calibration, se informa este error No se encontró una solución estable: cambie el umbral interior o seleccione los contornos manualmente (código de error HALCON: 3661). Solución: Establezca el parámetro DistortionCenter del operador radial_distortion_self_calibration en 'fijo' o 'adaptativo'. Si se cambia a 'fijo' o 'adaptable' y sigue informando un error, entonces: (1) El valor de InlierThreshold debe aumentarse adecuadamente (2) El número de filas y columnas del tablero de ajedrez debe aumentarse adecuadamente. 5. Resumen
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí


inserte la descripción de la imagen aquí






El operador de autocalibración Halcon puede calibrar los parámetros internos de la cámara (sin distancia focal) sin usar una placa de calibración, y es imposible obtener los parámetros externos de la cámara en comparación con múltiples calibraciones. Debido a que la distorsión es generalmente más severa en los bordes de la imagen, es necesario asegurarse de que haya suficientes segmentos de línea recta alrededor de los bordes de la imagen. En el proyecto real, es imposible que los objetos a fotografiar tengan bordes rectos ideales como en la rutina. La alternativa es: usar película para hacer una impresión en negro de cuadrícula (10*10, que se puede ajustar de acuerdo con su situación real) para llenar todo el campo de visión. La corrección de la distorsión se puede realizar después de obtener la referencia interna de la cámara. Por lo tanto, la autocalibración es más rápida en la corrección de la distorsión que la calibración de fotogramas múltiples, por lo que el equipo es más fácil de operar y mantener en el sitio. Después de la corrección de la distorsión, también podemos colocar un objeto de referencia para obtener el equivalente en píxeles y construir un sistema de coordenadas universales XY para aplicaciones como la medición y el posicionamiento. Si necesita convertir unidades de píxeles en unidades públicas, también puede usar tableros de ajedrez, objetos estándar, hojas de película, etc. para la conversión y luego aplicarlos a proyectos de medición; también puede usar una determinada cuadrícula para construir un sistema de coordenadas XY para proyectos de posicionamiento, de modo que los proyectos de medición y corrección de distorsión se puedan realizar sin el uso de placas de calibración.

Supongo que te gusta

Origin blog.csdn.net/Douhaoyu/article/details/128330952
Recomendado
Clasificación