python opencv图片畸变校正remap

相机标定后,得到了相机的内外参数,和畸变系数

这时,处理每一张图像其实应该进行畸变校正和重映射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)
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值