Corrección de distorsión de imagen panorámica

1. Introducción

Una cámara ideal básicamente utiliza imágenes estenopeicas. En el modelo de imágenes estenopeicas, si la distancia focal es constante, el área del plano de píxeles del sensor de imagen determina directamente el tamaño del campo de visión de la cámara. Objetos más allá de este campo de visión no será capturado El objetivo es adquirido. Por lo tanto, la cámara basada en el principio de imagen de la lente no puede tener un campo de visión lo suficientemente grande, y el campo de visión horizontal es generalmente inferior a 140°.

Pero en algunos campos, como la ciencia meteorológica, los trabajadores científicos y tecnológicos necesitan observar cambios en el cielo y fenómenos astronómicos, y necesitan una cámara que pueda capturar todo el cielo hemisférico a la vez. En el campo del monitoreo de seguridad, el equipo de seguridad espera una cámara que pueda capturar toda el área de monitoreo a la vez a vista de pájaro. Para lograr estos objetivos, la cámara debe tener un campo de visión horizontal de 180° o incluso mayor.

Justo cuando los investigadores estaban pensando mucho, la biónica se puso de pie sin dudarlo en este momento. Los científicos han descubierto que cuando los ojos de los peces miran hacia arriba, pueden ver todo el espacio hemisférico sobre el agua. Después de una cuidadosa investigación, los científicos descubrieron que debido a que el índice de refracción del agua es más alto que el del aire, la luz se refractará después de ingresar al agua desde el aire y el ángulo de refracción es más pequeño que el ángulo de incidencia. Al mismo tiempo, a medida que aumenta el ángulo de incidencia, también aumenta la medida en que el ángulo de refracción se vuelve más pequeño. Según esta característica, los objetos en un espacio hemisférico de 180° en la superficie del agua pueden distorsionarse y comprimirse en un plano de imagen limitado.
 

cc86a94cf53de5a2320bdda0e2a2dab5.png

Aunque esto aumenta considerablemente el campo de visión y el ángulo que se puede ver es mayor, también causa el problema de la distorsión de la imagen.

2. Distorsión de imagen

El proceso de imagen de la cámara es esencialmente la conversión del sistema de coordenadas. Primero, los puntos en el espacio se convierten del "sistema de coordenadas mundial" al "sistema de coordenadas de la cámara", y luego se proyectan al plano de imágenes (sistema de coordenadas físicas de la imagen), y finalmente los datos en el plano de imágenes se convierten al sistema de coordenadas de píxeles de la imagen. Sin embargo, debido a la desviación de la precisión de fabricación de la lente y del proceso de ensamblaje, se introducirá distorsión, lo que resultará en una distorsión de la imagen original. La distorsión de la lente se divide en distorsión radial y distorsión tangencial. ver:

http://blog.csdn.net/dcrmg/article/details/52950141

http://blog.csdn.net/waeceo/article/details/50580808

Dado que la distorsión tangencial se debe a la desviación del proceso de montaje, la mayoría de nuestras principales soluciones son la corrección de la distorsión radial de la imagen.

3. Corrección de distorsión

Si desea corregir la distorsión de la imagen, necesita conocer varios parámetros, que son los parámetros internos de la cámara, incluida la distancia focal, el centro de imagen y los parámetros de distorsión de la cámara; los parámetros externos de la cámara, incluida la matriz de rotación y matriz de traslación. Si conoce los parámetros internos de la cámara en detalle, la corrección de la imagen es fácil, pero en la mayoría de los casos no los conoce, por lo que necesita obtener los parámetros internos y externos de la cámara a través de la calibración de la cámara.

Ahora, el método más utilizado es el método de calibración de Zhang Zhengyou. Si no lo conoce, simplemente búsquelo y lo encontrará. Aquellos que son capaces pueden entender los principios específicos, pero lo más importante es saber cómo usarlo.

La más utilizada es calibrar los parámetros de la cámara con un tablero de ajedrez, los pasos son los siguientes:

1. Se requiere un tablero de ajedrez, cuanto mayor sea la precisión, mejor, y es mejor que todo el tablero de ajedrez esté en el mismo plano sin golpes.

2. Dispara el tablero de ajedrez desde múltiples perspectivas. El tablero de ajedrez debe aparecer en todas las imágenes, preferiblemente en varias posiciones de la imagen. Por ejemplo, el tablero de ajedrez aparece en la esquina superior izquierda de la imagen en una imagen y en la esquina superior derecha. en una imagen Lo mejor es poder capturar 10-15 imágenes.

3. Use el paquete que viene con opencv para detectar las esquinas del tablero de ajedrez y obtenga las coordenadas objpoint de las esquinas inferiores en el sistema de coordenadas mundial y las coordenadas de píxeles imgpoint de las esquinas inferiores en el sistema de coordenadas de píxeles.

4. Use objpoint e imgpoint para calibrar los parámetros de la cámara para obtener los parámetros internos de la cámara, los coeficientes de distorsión, la matriz de rotación y la matriz de traducción.

5. Utilice los parámetros de la cámara obtenidos para corregir la distorsión de la imagen.

4. Código de corrección de distorsión

# coding:utf-8
import cv2
import numpy as np
import glob

# 找棋盘格角点
# 阈值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# 棋盘格模板规格
w = 9
h = 6
# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w * h, 3), np.float32)
objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)
# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = []  # 在世界坐标系中的三维点
imgpoints = []  # 在图像平面的二维点

images = glob.glob('D:images\\*.jpg')
for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 找到棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, (w, h), None)
    # 如果找到足够点对,将其存储起来
    if ret == True:
        cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        objpoints.append(objp)
        imgpoints.append(corners)
        # 将角点在图像上显示
        cv2.drawChessboardCorners(img, (w, h), corners, ret)
        cv2.imshow('findCorners', img)
        # cv2.imwrite('D:images\\grid_out.png', img)
        cv2.waitKey(1)
cv2.destroyAllWindows()

# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# print(mtx)
# print(dist)
# print(rvecs)
# print(tvecs)
# 去畸变
img2 = cv2.imread('D:images\\10.jpg')
h, w = img2.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))  # 自由比例参数
dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
# 根据前面ROI区域裁剪图片
# x,y,w,h = roi
# dst = dst[y:y+h, x:x+w]
cv2.imwrite('D:images\\grid_out.png', dst)

# 反投影误差
total_error = 0
for i in range(len(objpoints)):
    imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
    error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)
    total_error += error
print("total error: ", total_error / len(objpoints))

# 校正视频
cap = cv2.VideoCapture('D:video\\video.mp4')
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_size = (width, height)
video_writer = cv2.VideoWriter('D:video\\result2.mp4', cv2.VideoWriter_fourcc(*"mp4v"), fps, frame_size)
for frame_idx in range(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))):
    ret, frame = cap.read()
    if ret:
      image_ = cv2.undistort(frame, mtx, dist, None, newcameramtx)
      cv2.imshow('jiaozheng', image_)
      # gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
      video_writer.write(image_)
    if cv2.waitKey(10) & 0xFF== ord('q'):
        break
cap.release()
# cv2.destroyALLWindows()

5. Otros complementos

Si no hay placa de calibración o no es conveniente usar la placa de calibración, si queremos calibrar los parámetros de la cámara, podemos obtener un punto de objeto sin detección de esquinas, y podemos marcarlo manualmente. Lo mejor es poner algunos marcadores en la imagen. , preferiblemente en forma de mesa rectangular. , como 4x4. Aunque hay algunos errores en esta calibración, también puede tener buenos resultados.

Supongo que te gusta

Origin blog.csdn.net/Orange_sparkle/article/details/130102267
Recomendado
Clasificación