Smart Car Experiment 2 (calibração do sensor de visão)

Experimento 2 Calibração do Sensor de Visão (Relatório do Experimento)

【Propósito】

       1. Compreender a estrutura da biblioteca de processamento de imagem de código aberto OpenCV e dominar o uso básico do OpenCV.

       2. Compreender as funções básicas do módulo da biblioteca de processamento de imagem de código aberto OpenCV e dominar os métodos comuns de processamento de imagem.

       3. Domine o algoritmo de calibração da câmera e aprenda a usar o OpenCV para calibração da câmera.

【Natureza experimental】

Experimento confirmatório.

【Requisitos Experimentais】

       1. Ambiente de desenvolvimento integrado C++ (QT5 ou VS2015 e superior)

       2、OpenCV 4.x

       3. Câmera única/binocular

【Conteúdo experimental】

       1. Domine o uso básico da biblioteca de imagens de código aberto OpenCV

       2. Use OpenCV para calibração de câmera monocular

       3. Use OpenCV para calibração de câmera binocular

【Etapas experimentais】

       1. Baixe, instale, OpenCV 4.x

       Download do site oficial: https://opencv.org/opencv-4-6-0/

      

       2. Princípio de calibração da câmera

O objetivo da calibração da câmera é estabelecer a correspondência entre o sistema de coordenadas do mundo tridimensional e o sistema de coordenadas da imagem bidimensional. Na visão monocular, essa correspondência é um-para-muitos, ou seja, um pixel em uma imagem bidimensional corresponde a uma linha reta no espaço tridimensional; na visão binocular, a correspondência entre duas imagens bidimensionais pode ser os pontos de pixel são calculados para obter a correspondência de um para um entre o sistema de coordenadas do mundo tridimensional e o sistema de coordenadas de imagem bidimensional. A partir disso, o valor da coordenada tridimensional do objeto pode ser obtido.

O parâmetro de posição de instalação da câmera é um parâmetro externo e o parâmetro de distorção da lente da câmera é um parâmetro interno do modelo não linear. O processo de calibração consiste em obter os parâmetros internos e os parâmetros externos da câmera, de modo a obter a matriz de rotação e o vetor de translação da transformação de coordenadas acima mencionada.

Figura 2-1 Modelo de imagem da câmera

Na figura, o sistema de coordenadas da câmera é OXcYcZc, e a relação de conversão entre o sistema de coordenadas da imagem do computador O0uv e o sistema de coordenadas do plano da imagem O1xy é:

u = sux + u0

v = svy + v0

Escrito na forma matricial como:

u v 1 = s u 0 u 0 0 s v v 0 0 0 1 x y1

Entre eles, su e sv são o número de pixels correspondentes ao comprimento da unidade nas direções do eixo x e do eixo y, respectivamente; u0 e v0 são a posição do centro óptico da lente e a unidade é mm.

Por favor, escreva a relação de conversão entre o sistema de coordenadas do plano da imagem do computador O0uv e o sistema de coordenadas do mundo em forma de matriz:

Entre eles, Xw , Yw , Zw são o sistema de coordenadas mundiais, R é uma matriz quadrada de ordem 3X3; T é uma matriz vetorial de translação 3X1 dimensional.

Z c u v 1 = s u 0 u 0 0 s v v 0 0 0 1 x y 1 = s u 0 u 0 0 s v v 0 0 0 1 f 0 0 0 0 f 0 0 0 0 1 0 X c Y c Z c 1 = s u 0 u 00 s v v 0 0 0 1 f 0 0 0 0 f 0 0 0 0 1 0 R T 0 1 X w Y w Z w1

Na verdade, a imagem da lente da câmera não é uma imagem em perspectiva ideal, mas existem diferentes graus de distorção sob a influência de deformação radial, deformação excêntrica, deformação de prisma fino e outros fatores. Devido ao efeito dos fatores de distorção, a imagem do ponto espacial não está na posição x, y descrita pelo modelo linear , mas nas coordenadas planas x ' , y' compensadas pela distorção da lente .

x= x ' + ∆x y= y '+ ∆y

Dentre eles, ∆x e ∆y são valores de distorção não linear, que estão relacionados com a posição do ponto da imagem na imagem. Geralmente, a distorção da lente tem distorção radial e distorção tangencial ao mesmo tempo. A distorção tangencial é causada pela lente não estar paralela ao plano do sensor da câmera ou ao plano da imagem. É causada principalmente pelo desvio da lente instalada no módulo da lente , que geralmente é pequeno. Em aplicações práticas, apenas a distorção radial é considerada. A distorção radial é frequentemente expressa pelos primeiros termos da expansão da série de Taylor da distância radial do centro da imagem:

∆x= x ' - u 0 k 1 r 2 + k 2 r 4 +… ∆y= y ' - v 0 k 1 r 2 + k 2 r 4+…

k1 e k2 são parâmetros de distorção não linear, r 2 = x ' - u 0 2 + y ' - v 02 .

Existem muitos métodos de calibração de câmeras, que podem ser divididos em tecnologia de calibração tradicional e tecnologia de autocalibração.

Tecnologia de calibração tradicional:     é necessário colocar um objeto de calibração específico na frente da câmera e fornecer artificialmente um conjunto de primitivas de recursos com coordenadas conhecidas, e a câmera obtém a calibração procurando primitivas desses recursos conhecidos                                              

Tecnologia de autocalibração:      é mais flexível e não requer um objeto de referência específico, utiliza a rigidez do ambiente para calcular o modelo da câmera comparando pontos correspondentes em múltiplas imagens.                      

O OpenCV adota um método entre o método de calibração tradicional e o método de autocalibração, proposto por Zhang Zhengyou. Este método não precisa saber as informações específicas do movimento da câmera, que é mais flexível do que o método de calibração tradicional. Ao mesmo tempo, ele ainda precisa de um objeto de calibração específico e um conjunto de coordenadas conhecidas das primitivas de recurso, que é não tão flexível quanto a autocalibração. Calcula todos os parâmetros internos e externos da câmera adquirindo imagens do objeto de calibração em pelo menos 3 posições diferentes.

Referência de descrição do algoritmo de calibração Zhihu: https://zhuanlan.zhihu.com/p/36371959

O código-fonte do OpenCV possui um tabuleiro de xadrez embutido (chessboard.png) em seu diretório sample/data, que é exibido da seguinte forma:

    Ao calibrar, o algoritmo requer a largura e a altura do tabuleiro de damas, bem como seu espaçamento. Deve-se notar que a largura e a altura aqui se referem ao número de suas interseções internas, por exemplo, na figura acima, seu tamanho é 7x7 em vez de 8x8. O espaçamento refere-se à distância entre as peças do tabuleiro de xadrez, que pode ser expressa em distâncias de pixel ou em milímetros reais.

       3. Calibrar funções comuns

(1)findChessboardCorners()

bool findChessboardCorners( InputArray image, Size patternSize, OutputArray corners,

            sinalizadores int = CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE );

       Função função: determine se a imagem de entrada é um padrão quadriculado e determine a posição dos pontos de canto. Se todos os cantos forem detectados e organizados em uma determinada ordem (linha por linha, cada linha da esquerda para a direita), a função retornará um valor diferente de zero, caso contrário, caso a função não consiga encontrar todos os cantos ou registrá-los, a função retornará 0                               

(2)cv::drawChessboardCorners()

drawChessboardCorners( imagem InputOutputArray, Tamanho padrãoTamanho,

                           cantos InputArray, bool patternWasFound );

       Função: usado para desenhar os pontos de canto calibrados com sucesso ao calibrar a câmera                                           

   

(3)find4QuadCornerSubpix()

       find4QuadCornerSubpix(InputArray img, cantos InputOutputArray, tamanho region_size );

       Função função: Encontre a posição precisa do sub-pixel do canto do tabuleiro de xadrez. Tenta aproximar as linhas que separam os campos quadriculados (" quads ") e retorna as interseções dessas linhas.                                                        

(4)cantoSubPix()

       void cornerSubPix( imagem InputArray, cantos InputOutputArray, Tamanho winSize,

                       Tamanho zeroZone, critério TermCriteria );

       Função função: otimize a posição do canto e obtenha o canto sub-pixel no tabuleiro de damas .                                                          

(5)calibrateCamera()

       double calibrateCamera( InputArrayOfArrays objectPoints,

                            InputArrayOfArrays imagePoints,

                            Tamanho da imagemTamanho,

                            InputOutputArray cameraMatrix,

                            InputOutputArray distCoeffs,

                            OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs,

                            sinalizadores int = 0,

                            Critérios TermCriteria = TermCriteria(TermCriteria::COUNT +

                            TermCriteria::EPS, 30, DBL_EPSILON) );

       Função função: Através da correspondência 2D/3D de vários ângulos de visão, resolva os parâmetros internos da câmera e os parâmetros externos de cada ângulo de visão                                                         

(6)initUndistortRectifyMap()

       void initUndistortRectifyMap(InputArray cameraMatrix,

                                InputArray distCoeffs,

                                InputArray R,

                                InputArray novaCameraMatrix,

                                tamanho tamanho,

                                int m1type,

                                OutputArray map1,

                                OutputArray map2)

       Função função: Esta função é usada para calcular a relação de transformação sem distorção e correção.                                                           

       4. Calibração da câmera monocular

(1) Abra o arquivo de parâmetros de configuração de calibração default.xml e defina os parâmetros:

  1. A largura e a altura do tabuleiro de damas (o número de pontos de canto em duas direções), definidas de acordo com a situação real.

      <!-- Número de cantos internos por linha e coluna de um item. (quadrado, círculo) -->

      < BoardSize_Width > 9 </ BoardSize_Width >

     < BoardSize_Height > 6 </ BoardSize_Height >

  1. a largura de cada grade

A largura da célula deve ser definida para o número real de milímetros.

  <!-- O tamanho de um quadrado em algum sistema métrico definido pelo usuário (pixel, milímetro) -->

  < Square_Size > 50 </ Square_Size >

  1. Escolha o método de entrada

O programa fornece 3 métodos de entrada. Se a câmera estiver conectada ao computador, você pode usar o método input_camera. Este método só precisa definir o número do dispositivo de entrada de vídeo. Para notebooks, geralmente 0 significa a câmera interna do notebook e 1 significa a câmera externa.

  1. Compilar o programa de calibração OpenCV

(2) O programa de calibração realizará as seguintes funções

  • Determinando a Matriz de Distorção
  • Determinar a matriz da câmera
  • Entrada de lista de câmeras, arquivos de vídeo e imagem
  • Configuração de arquivos XML/YAML
  • Salve o resultado em um arquivo XML/YAML
  • Calcular erro de reprojeção

O programa tem apenas um parâmetro. O nome de seu arquivo de configuração. Caso contrário, ele tentará abrir um arquivo chamado "default.xml".

(3) Execute o programa de calibração, a câmera tirará 25 fotos e identificará os cantos, conforme mostrado abaixo

(4) O resultado da calibração é salvo no arquivo de resultados especificado no programa

    Explique o significado de cada dado no arquivo de resultados no relatório do experimento (leia o código e verifique as informações relevantes online)

< nr_of_frames >25 </ nr_of_frames >

largura e altura da imagem

< image_width >640 </ image_width >

< image_height >480 </ image_height >

Largura do tabuleiro de damas 11 e altura 8

< board_width >11 </ board_width >

< board_height >8 </ board_height >

tamanho da célula

< tamanho_quadrado >50. </ tamanho_quadrado >

tipo de câmera

< fisheye_model >0 </ fisheye_model >

Tamanho adaptável

< fix_aspect_ratio >1. </ fix_aspect_ratio >

Os dados da matriz de parâmetros internos da câmera são o valor

Linhas e colunas para linhas e colunas

Dt significa classe de dados nova

< camera_matrix type_id =" opencv-matrix ">< linhas >3 </ linhas > < cols >3 </ cols >

< dt >d </ dt >

< data > 7.0111172389870558e+02 0. 3.1950000000000000e+02 0. 7.0111172389870558e+02 2.39500000000000000e+02 0. 0. 1.

</data></camera_matrix>

畸变系数

Row和cols为维度

Data包含畸变系数实际的值

<avg_reprojection_error>

为平均投影误差值

<distortion_coefficients type_id="opencv-matrix"><rows>5</rows><cols>1</cols>

<dt>d</dt>

<data> 7.2399710954221264e-02 4.5114674802590399e-01 0. 0. -3.8163393536623835e+00</data></distortion_coefficients><avg_reprojection_error>4.1946356118960665e-01</avg_reprojection_error>

<extrinsic_parameters type_id="opencv-matrix"><rows>25</rows><cols>6</cols>

数据类型为double

<dt>d</dt>

<data>

数据太长这里省略

</data>

<image_points type_id="opencv-matrix">

<rows>25</rows><cols>88</cols>

数据类型为浮点

<dt>"2f"</dt>

<data>1.96974991e+02 3.05226959e+02 2.15540726e+02 3.04309814e+02 2.34028198e+02 3.03369354e+02 2.52492340e+02 3.02424805e+02 2.70655762e+02 3.01588440e+02 2.88653290e+02 3.00733093e+02 3.06717133e+02 2.99980408e+02 3.24438385e+02 2.99227295e+02 3.42079742e+02 2.98437469e</data>

这里也是数据太长省略

<grid_points> 0. 0. 0. 50. 0. 0. 100. 0. 0. 150. 0. 0. 200. 0. 0. 250. 0. 0. 300. 0. 0. 350. 0. 0. 400. 0. 0. 450. 0. 0. 500. 0. 0. 0. 50. 0. 50. 50. 0. 100. 50. 0. 150. 50. 0. 200. 50. 0. 250. 50. 0. 300. 50. 0. 350. 50. 0. 400. 50. 0. 450. 50. 0. 500. 50. 0. 0. 100. 0. 50. 100. 0. 100. 100. 0. 150. 100. 0. 200. 100. 0. 250. 100. 0. 300. 100. 0. 350. 100. 0. 400. 100. 0. 450. 100. 0. 500. 100. 0. 0. 150. 0. 50. 150. 0. 100. 150. 0. 150. 150. 0. 200. 150. 0. 250. 150. 0. 300. 150. 0. 350. 150. 0. 400. 150. 0. 450. 150. 0. 500. 150. 0. 0. 200. 0. 50. 200. 0. 100. 200. 0. 150. 200. 0. 200. 200. 0. 250. 200. 0. 300. 200. 0. 350. 200. 0. 400. 200. 0. 450. 200. 0. 500. 200. 0. 0. 250. 0. 50. 250. 0. 100. 250. 0. 150. 250. 0. 200. 250. 0. 250. 250. 0. 300. 250. 0. 350. 250. 0. 400. 250. 0. 450. 250. 0. 500. 250. 0. 0. 300. 0. 50. 300. 0. 100. 300. 0. 150. 300. 0. 200. 300. 0. 250. 300. 0. 300. 300. 0. 350. 300. 0. 400. 300. 0. 450. 300. 0. 500. 300. 0. 0. 350. 0. 50. 350. 0. 100. 350. 0. 150. 350. 0. 200. 350. 0. 250. 350. 0. 300. 350. 0. 350. 350. 0. 400. 350. 0. 450. 350. 0. 500. 350. 0.</ grid_points ></ opencv_storage >

<pontos_de_grade> _ _

Aqui está a calibração da foto e as coordenadas são pixels

Acho que você gosta

Origin blog.csdn.net/m0_59054762/article/details/130606934
Recomendado
Clasificación