【opencv】图像畸变校正

接上篇文章:【鱼眼+普通相机】相机标定

附代码:

方法一:

使用cv2.undistort

"""
    Create May 11, 2024
    @author Wang Jiajun
"""

import cv2
import numpy as np


def correct(img,camera_file='E:/calib_yaml/ship_calib.yaml'):
    """
    矫正图像,去除畸变
        img: 输入图像
        camera_file: 相机参数文件
        return: 矫正后的图像
    """
    fs = cv2.FileStorage(camera_file, cv2.FILE_STORAGE_READ)
    camera_matrix = fs.getNode("camera_matrix").mat()
    dist_coeffs = fs.getNode("dist_coeffs").mat()  # 畸变参数--顺序很重要!!!:k1,k2,p1,p2,k3
    resolution = fs.getNode("resolution").mat()  # 图像分辨率
    imSize = (resolution[0][0], resolution[1][0])
    fs.release()

    # 矫正图像
    img_distort = cv2.undistort(img, np.array(camera_matrix), np.array(dist_coeffs))
    return img_distort 


if __name__ == '__main__':
    camera_file = 'E:/calib_yaml/ship_calib.yaml'
    video = cv2.VideoCapture(0)
    while True:
        ret, img = video.read()
        # 3. 矫正图像
        img = cv2.resize(img, (640, 480))
        cv2.putText(img, "Press q to exit", (20, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 200, 0), 2)
        img_distort = cv2.correct(img, camera_file )
        # 4. 显示原图和矫正后的图像
        cv2.imshow('img_original', img)
        cv2.imshow('img_distort', img_distort)
        key = cv2.waitKey(1)
        # 5. 按q退出
        if key & 0xFF == ord('q'):
            break
    # 6. 关闭窗口
    video.release()
    cv2.destroyAllWindows()

方法二:

使用cv2.initUndistortRectifyMap建立映射关系,就不用每次读取内参了,速度更快。

"""
    Create May 11, 2024
    @author Wang Jiajun
"""

import cv2
import numpy as np


def correct(camera_file='E:/calib_yaml/ship_calib.yaml'):
    """
    矫正图像,去除畸变
        img: 输入图像
        camera_file: 相机参数文件
        return: 矫正后的图像
    """
    fs = cv2.FileStorage(camera_file, cv2.FILE_STORAGE_READ)
    camera_matrix = fs.getNode("camera_matrix").mat()
    dist_coeffs = fs.getNode("dist_coeffs").mat()  # 畸变参数--顺序很重要!!!:k1,k2,p1,p2,k3
    resolution = fs.getNode("resolution").mat()  # 图像分辨率
    imSize = (resolution[0][0], resolution[1][0])
    fs.release()

    # 矫正图像
    new_camera_matrix, roi = cv2.getOptimalNewCameraMatrix(np.array(camera_matrix), np.array(dist_coeffs),
                                                           imSize, 0,
                                                           imSize)
    map1, map2 = cv2.initUndistortRectifyMap(np.array(camera_matrix), np.array(dist_coeffs), None, new_camera_matrix,
                                             imSize, cv2.CV_32FC1)
    # img_distort = cv2.undistort(img, np.array(camera_matrix), np.array(dist_coeffs))
    return map1, map2


if __name__ == '__main__':
    camera_file = 'E:/calib_yaml/ship_calib.yaml'
    map1, map2 = correct(camera_file)
    video = cv2.VideoCapture(0)
    while True:
        ret, img = video.read()
        # 3. 矫正图像
        img = cv2.resize(img, (640, 480))
        cv2.putText(img, "Press q to exit", (20, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 200, 0), 2)
        img_distort = cv2.remap(img, map1, map2, cv2.INTER_LINEAR)
        # 4. 显示原图和矫正后的图像
        cv2.imshow('img_original', img)
        cv2.imshow('img_distort', img_distort)
        key = cv2.waitKey(1)
        # 5. 按q退出
        if key & 0xFF == ord('q'):
            break
    # 6. 关闭窗口
    video.release()
    cv2.destroyAllWindows()

### 回答1: OpenCV图像畸变校正是一种图像处理方法,用于纠正图像中由于摄像头镜头畸变引起的失真。 畸变分为径向畸变和切向畸变两种。径向畸变是由于镜头的曲率不均匀而引起的,主要表现为图像中心附近的特征点扩散或收缩。切向畸变是由于镜头与图像平面不平行而引起的,主要表现为图像中心附近的特征点偏移。 为了校正图像畸变,首先需要获取相机的内部参数矩阵。这些参数包括焦距、主点坐标和畸变系数。然后,可以通过使用这些参数计算出畸变校正的映射函数。 畸变校正的映射函数是根据径向畸变和切向畸变的模型进行计算的。对于径向畸变,可以使用二项式模型进行建模。对于切向畸变,可以使用仿射变换进行建模。 一旦得到畸变校正的映射函数,就可以将图像中的每个像素坐标映射到校正后的图像中的对应位置。根据映射函数的计算结果,可以通过插值算法获得对应位置的像素值。 OpenCV提供了用于畸变校正的函数cv::undistort()。这个函数接受输入图像、相机内部参数矩阵和畸变系数作为输入,并返回校正后的图像。 通过使用OpenCV畸变校正函数,我们可以将镜头畸变引起的图像失真校正,得到更加真实和准确的图像。这对于计算机视觉图像处理任务非常重要,例如物体检测、目标跟踪和三维重构等。 ### 回答2: OpenCV是一个开源的计算机视觉库,提供了一系列图像处理和计算机视觉算法。其中一个功能是图像畸变校正,可以通过使用OpenCV库中的函数来实现。 图像畸变校正校正图像中的畸变,即由于相机镜头和光学系统的特性引起的图像畸变图像畸变一般包括径向畸变和切向畸变。 径向畸变是由于相机镜头的形状引起的,使得离中心点越远的像素位置与实际位置之间有所偏差。切向畸变则是由于镜头装配不完美或相机传感器平面与光轴不平行导致的图像失真。 校正图像畸变的步骤如下: 1. 从相机或设备获取图像。 2. 检测并识别相机的内标定参数,包括相机的焦距、畸变系数等。 3. 利用相机内参和外参,根据畸变模型计算每个像素的畸变向量。 4. 对每个像素点应用畸变向量,将其映射到没有畸变的位置。 5. 可以选择进行裁剪,将不需要的黑边去除,得到校正后的图像OpenCV中提供了函数cv::undistort()来实现图像畸变校正。该函数需要输入畸变图像、相机的内标定参数矩阵、畸变系数等作为输入,然后返回校正后的图像。 总而言之,OpenCV提供了实现图像畸变校正的函数,可以便捷地对图像进行畸变校正,提高图像的质量和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值