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.
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:
ponto do espaço 3D:
Coordenadas homogêneas: ,
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
: matriz extrínseca
: 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 , então:
Em seguida, o mapeamento do espaço para a imagem pode ser alterado para:
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 é uma matriz simétrica e sua incógnita pode ser expressa como um vetor 6D
Seja a i-ésima coluna em H , de acordo com a definição de b, deduza:
Pode-se deduzir que:
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 é o 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 0 .
, 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, , pode ser deduzido:
De um modo geral, a solução 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
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.