相机标定后,得到了相机的内外参数,和畸变系数
这时,处理每一张图像其实应该进行畸变校正和重映射remap
原理是根据相机标定后的参数生成一个_mapx1和_mapy1的索引表,将每张图像x1 y1对照索引表重新映射,其他没映射到的点就差值就行。其实remap就是一个重映射,然后在空隙处差值的函数。
下面的程序就是一段remap函数,相机参数都已经写死了,只需更改路径和图片尺寸就行就行,程序简单,直接把一个文件夹的图片都remap了,生成的图片存放在一个自动建的新的文件夹中(自己设定的名字)。
注:我这组内参的相机主点,尤其是x轴主点,有点离谱,差的很大,但校正完效果还行,是正常的。主点不准,是因为我标定图像采集的不好,造成的。
代码如下:
import os
import cv2
import numpy as np
import matplotlib.image
import PIL
'''写入相机的内参和图像的尺寸信息'''
imgW = 1080
imgH = 1920
cameraMatrix1 = np.array([[
5054.192705677948,
0.0,
282.898225002617
],
[
0.0,
5045.038327922591,
951.0225077482205
],
[
0.0,
0.0,
1.0
]])
distCoef1 = np.array([
-0.2930293595586682,
8.777126464444137,
-0.005441863361565648,
-0.005820438188928533,
-243.4297495952012
])
R1 = np.array([[
0.9992354136553142,
0.005661450543078256,
-0.03868508853345731],[
-0.005499550425944028,
0.9999756742118588,
0.0042902132407366105],[
0.03870843631827112,
-0.004074182407155097,
0.999242241899084]])
P1 = np.array([
[
5038.404593280553,
0.0,
465.5258102416992,
0.0
],
[
0.0,
5038.404593280553,
907.9961013793945,
0.0
],
[
0.0,
0.0,
1.0,
0.0
]
])
_mapx1 = None
_mapy1 = None
'''畸变校正并插值生成新图片的函数'''
def toRemap(filename):
img = cv2.imread(file_path+'/'+filename, 1) # 1是以彩色图方式去读
_mapx1, _mapy1 = cv2.initUndistortRectifyMap(cameraMatrix1, distCoef1,
R1, P1, (imgW, imgH),
cv2.CV_16SC2)
img1 = cv2.remap(img, _mapx1, _mapy1, cv2.INTER_LINEAR)
cv2.imwrite(out_path + '/' + filename, img1) # 保存在新文件夹下
'''文件路径'''
file_path = "C:/Users/lenovo/Desktop/3/rotated/" # 输入文件夹
os.mkdir("C:/Users/lenovo/Desktop/3/remap") # 建立新的目录
out_path ="C:/Users/lenovo/Desktop/3/remap" # 设置为新目录为输出文件夹
'''主函数,遍历图片进行remap'''
if __name__ == "__main__":
for filename in os.listdir(file_path): # 遍历输入路径,得到图片名
print(filename)
toRemap(filename)