Visão computacional Python (4) - calibração da câmera

1. Princípios de calibração da câmera

    O objetivo da calibração da câmera é obter os parâmetros da própria câmera. Parâmetros de calibração apropriados são os pré-requisitos para que a câmera obtenha com precisão as informações do alvo. Este artigo apresenta o método de calibração da câmera de Zhang Zhengyou. O processo de calibração da câmera é converter o sistema de coordenadas mundiais para o sistema de coordenadas da câmera através da transformação do corpo rígido, depois converter o sistema de coordenadas da câmera para o sistema de coordenadas da imagem através da transformação da projeção e, finalmente, converter o sistema de coordenadas da imagem para o sistema de coordenadas do pixel através transformação da tradução. A relação de conversão do sistema de coordenadas durante o disparo da câmera é mostrada na figura abaixo.

Diagrama de conversão do sistema de coordenadas

 2. Método de calibração da câmera Zhang Zhengyou

    A calibração de Zhang Zhengyou refere-se ao método de calibração de câmera checkerboard de plano único proposto pelo professor Zhang Zhengyou em 1998. Este método está entre o método de calibração tradicional e o método de autocalibração. Ele não apenas supera as deficiências do objeto de calibração de alta precisão exigido pelo método de calibração tradicional, mas também melhora a precisão e é fácil de operar em comparação com o método de autocalibração. método de calibração. Portanto, o método de calibração de Zhang Zhengyou é amplamente utilizado em visão computacional.

Etapas gerais do método de calibração de Zhang Zhengyou:

1. Imprima um pedaço de papel quadriculado A4 (o espaçamento preto e branco é conhecido) e cole-o em uma placa plana

2. Tire várias fotos para o tabuleiro de damas (geralmente 10 a 20 fotos)

3. Detectar pontos característicos (cantos de Harris) na imagem

4. Resolva a matriz homográfica de acordo com as informações de posição de canto e as coordenadas na imagem

5. Usando o método de estimativa de solução analítica para calcular 5 parâmetros internos e 6 parâmetros externos

6. De acordo com a estratégia de estimativa de máxima verossimilhança, projete a meta de otimização e realize o refinamento dos parâmetros

3. Princípio matemático do método de calibração de Zhang Zhengyou

3.1 Introdução de parâmetros

Pontos de imagem 2D:m=\begin{pmatriz} u & v \end{pmatriz}^{T}

ponto do espaço 3D:M=\bigl(\begin{smallmatrix} X & Y& Z \end{smallmatrix}\bigr)^{T}

Coordenadas homogêneas: \tilde{m}=\begin{pmatrix} u &v &1 \end{pmatrix}^{T},\tilde{M}=\begin{pmatriz} X &Y &Z &1 \end{pmatriz}^{T}

Descreva o mapeamento das coordenadas do espaço para as coordenadas da imagem:

s: fator de escala do sistema de coordenadas mundial para o sistema de coordenadas de imagem

K: matriz de parâmetros internos da câmera

\begin{pmatrix} R&t \end{pmatrix}: matriz extrínseca

(u_{0},v_{0}): Como as coordenadas do ponto principal

α, β: fusão de distância focal e proporção de pixel

γ: parâmetro de distorção radial 

3.2 Solução de parâmetros internos

Suponha que o tabuleiro de damas esteja localizado em Z = 0,

Defina a i-ésima coluna da matriz de rotação R como r_{i}, então:

Em seguida, o mapeamento do espaço para a imagem pode ser alterado para:

s\tilde{m}=H\tilde{M}     

H=K\bigl(\begin{smallmatrix} r_{1} & r_{2}& t \end{smallmatrix}\bigr)

Onde H é uma descrição da matriz homográfica, que pode ser resolvida por mínimos quadrados das coordenadas mundiais dos cantos para as coordenadas da imagem

Seja H H = [h1 h2 h3]

A homografia tem 8 graus de liberdade. Através da operação matricial da equação acima, de acordo com a ortogonalidade de r1 e r2, e as restrições de normalização, pode-se obter a seguinte equação:

definição  B=K^{-T}K^{-1}== \begin{pmatrix} B_{11} & B_{21} & B_{31}\\ B_{12}& B_{22} & B_{32}\\ B_{13}& B_{23} & B_{33 } \end{pmatrix} _

 B é uma matriz simétrica e sua incógnita pode ser expressa como um vetor 6D b=\begin{bmatriz} B_{11} & B_{12} &B_{22} &B_{13} &B_{23} & B_{33} \end{bmatriz}^{T}

Seja a i-ésima coluna em H  h_{i}=\bigl(\begin{smallmatrix} h_{i1} & h_{i2} & h_{i3} \end{smallmatrix}\bigr)^{T}, de acordo com a definição de b, deduza:h_{i}^{T}Bh_{j}=v_{ij}^{T}b

Pode-se deduzir que:\begin{pmatrix} v_{12}^{T}\\ (v_{11}-v_{22})^{T} \end{pmatrix}b=0

Se houver n grupos de imagens observadas, então V é uma matriz 2n x 6 Vb=0,

De acordo com a definição de mínimos quadrados, a solução de V b = 0 é V^{T}Vo autovetor correspondente ao menor autovalor,

Portanto, b pode ser estimado diretamente, e os parâmetros internos podem ser resolvidos através de b posteriormente.

Quando a imagem observada n ≥ 3, a solução única de b pode ser obtida; quando n = 2, o parâmetro de distorção γ = 0 pode ser geralmente definido; quando n = 1, apenas α e β podem ser estimados e, neste momento geralmente pode ser assumido que as coordenadas do ponto principal somam u_{0}0 v_{0}.

B=K^{-T}K^{-1}, B é uma matriz simétrica construída por b,

Os parâmetros internos podem ser calculados pela seguinte fórmula (decomposição de Cholesky):

 3.3 Resolvendo parâmetros externos

Os parâmetros externos podem ser resolvidos por Homografia, H=\bigl(\begin{smallmatrix} h_{1} &h_{2} & h_{3} \end{smallmatrix}\bigr)=\lambda K\begin{pmatrix} r_{1} & r_{2} & t \end{pmatrix}, pode ser deduzido:

 De um modo geral, a solução R=\begin{pmatrix} r_{1} &r_{2} & r_{3} \end{pmatrix}não atenderá aos padrões de ortogonalidade e normalização.Na operação real, R pode ser normalizado por meio da decomposição SVD.

4. Procedimento experimental

1. Prepare um tabuleiro de xadrez preto e branco 5X5 conforme mostrado na figura abaixo

2. Ajuste o ângulo da câmera para tirar fotos quadriculadas em diferentes direções. O conjunto de imagens é mostrado na figura abaixo

 3. Extraia os pontos de canto do tabuleiro de damas na imagem e o conjunto de imagens de pontos de canto é mostrado na figura abaixo

Um exemplo é mostrado na figura abaixo:

​​​​​

 

4. Código

import cv2
import numpy as np
import glob

# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差阈值0.001
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 35, 0.001)

# 获取标定板4*4角点的位置
objp = np.zeros((4*4,3), np.float32)
objp[:,:2] = np.mgrid[0:4,0:4].T.reshape(-1,2) # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y

obj_points = [] # 存储3D点
img_points = [] # 存储2D点

# 获取指定目录下.jpg图像的路径
images = glob.glob(r"/Users/xionglulu/Downloads/project1/BW/*.jpg")
# print(images)

i=0
for fname in images:
    # print(fname)
    img = cv2.imread(fname)
    # 图像灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    size = gray.shape[::-1]
    # 获取图像角点
    ret, corners = cv2.findChessboardCorners(gray, (4, 4), None)
    # print(corners)

    if ret:
        # 存储三维角点坐标
        obj_points.append(objp)
        # 在原角点的基础上寻找亚像素角点,并存储二维角点坐标
        corners2 = cv2.cornerSubPix(gray, corners, (1, 1), (-1, -1), criteria)
        #print(corners2)
        if [corners2]:
            img_points.append(corners2)
        else:
            img_points.append(corners)
        # 在黑白棋盘格图像上绘制检测到的角点
        cv2.drawChessboardCorners(img, (4, 4),corners, ret)
        i+=1
        cv2.imwrite('conimg'+str(i)+'.jpg', img)
        cv2.waitKey(10)
print(len(img_points))
cv2.destroyAllWindows()

# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)

print('------照相机内参与外参------')
print("ret:", ret) # 标定误差
print("mtx:\n", mtx) # 内参矩阵
print("dist:\n", dist) # 畸变参数 distortion coefficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs:\n", rvecs) # 旋转向量 # 外参数
print("tvecs:\n", tvecs ) # 平移向量 # 外参数


img = cv2.imread(images[10])
print(images[10])
h, w = img.shape[:2]
# 计算一个新的相机内参矩阵和感兴趣区域(ROI)
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
print('------新内参------')
print (newcameramtx)
print('------畸变矫正后的图像newimg.jpg------')
newimg = cv2.undistort(img,mtx,dist,None,newcameramtx)
x,y,w,h = roi
newimg = newimg[y:y+h,x:x+w]
cv2.imwrite('newimg.jpg', newimg)
print ("newimg的大小为:", newimg.shape)

 5. Resultados experimentais

imagem original

Imagem após correção de distorção

 6. Análise de resultados experimentais

(1)ret: O erro calibrado, representando a média ou a soma dos erros de reprojeção. Erro de reprojeção refere-se ao erro entre as coordenadas de pixel previstas e as coordenadas de pixel reais calculadas projetando as coordenadas 3D em um plano 2D quando o resultado da calibração é aplicado à imagem do tabuleiro de damas. Quanto menor o erro de reprojeção, mais preciso será o resultado da calibração. O erro de calibração neste experimento é de 3,3357.Este erro ainda é muito grande, o que pode ser causado pelo pequeno número de imagens ou pela grande inclinação do ângulo de disparo.

(2) Pode-se observar pelos resultados experimentais que o valor do parâmetro espaçamento de pixels na matriz de referência interna mtx é 0, indicando que o espaçamento de pixels da câmera é uniforme. Neste caso, o espaçamento de pixels adjacentes na plano da imagem é igual.

(3) Quase não há diferença entre a imagem original e a imagem após a correção da distorção. Pode ser que os dados de calibração sejam insuficientes ou a precisão da placa de calibração seja baixa: se os dados de calibração forem insuficientes ou a precisão da calibração placa é baixa, afetará a precisão e precisão da calibração. Como resultado, o efeito de correção de distorção não é bom; ou a distorção da imagem da câmera é pequena: se a distorção da imagem da câmera for pequena, a imagem após a correção da distorção não é muito diferente da imagem original.

Acho que você gosta

Origin blog.csdn.net/summer_524/article/details/130875263
Recomendado
Clasificación