使用python opencv对畸变图像进行矫正的实现

 更新时间:2022年05月07日 10:50:11   作者:燕阳天  
本文主要介绍了使用python opencv对畸变图像进行矫正的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

代码:

__Author__ = "Shliang"
__Email__ = "shliang0603@gmail.com"

import os
import cv2
import numpy as np
from tqdm import tqdm



def undistort(frame):
    fx = 685.646752
    cx = 649.107905
    fy = 676.658033
    cy = 338.054431
    k1, k2, p1, p2, k3 = -0.363219, 0.093818, 0.006178, -0.003714, 0.0

    # 相机坐标系到像素坐标系的转换矩阵
    k = np.array([
        [fx, 0, cx],
        [0, fy, cy],
        [0, 0, 1]
    ])
    # 畸变系数
    d = np.array([
        k1, k2, p1, p2, k3
    ])
    h, w = frame.shape[:2]
    mapx, mapy = cv2.initUndistortRectifyMap(k, d, None, k, (w, h), 5)
    return cv2.remap(frame, mapx, mapy, cv2.INTER_LINEAR)


# 对摄像头实时视频流做畸变矫正
def distortion_correction_cam():
    cap = cv2.VideoCapture(0)
    while (cap.isOpened()):
        ret, frame = cap.read()
        undistort_frame = undistort(frame)
        compare = np.hstack((frame, undistort_frame))
        cv2.imshow('frame', compare)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()


# 对目录下的所有图片做畸变矫正,并把畸变矫正后的图片保存下来
def distortion_correction_imgs(input_dir, output_dir):
    in_imgs = os.listdir(input_dir)

    for img_name in tqdm(in_imgs):
        image = cv2.imread(os.path.join(input_dir, img_name))
        distroted_img = undistort(image)
        cv2.imwrite(os.path.join(output_dir, img_name), distroted_img)



if __name__ == '__main__':
    input_dir = "/home/shl/extract_rosbag_data/0324_bags/plycal_calib/root/images"
    output_dir = "/home/shl/extract_rosbag_data/0324_bags/plycal_calib/root/distro_imgs"
    # distortion_correction_imgs(input_dir, output_dir)

    distortion_correction_cam()

对图片进行矫正效果:

原图:

矫正后的图片:

采集的摄像头画面矫正效果:

从上面的换面可以看到,左边是未矫正的画面,右边是矫正后的画面

  • 矫正后的画面会被裁切,明显可以看到画面中的信息是有裁切的,例如左边的椅子已经被裁切掉了
  • 矫正后的画面和原画面是保持相同的分辨率:640x480,但是,为什么会看到画面会出现横向的拉伸,这是因为标定相机内参的时候画面的分辨率设置为1280x720=16:9,但是opencv读取摄像头默认的分辨率却是640x480=4:3,两者的比例都不一样,所以肯定会出现拉伸

解决拉伸的方式,就是把读取摄像头的时候,把摄像头的分辨率设置成和标定的时候一样的分辨率,设置为1280x720,下面是如何在opencv读取摄像头的时候设置摄像头分辨率:

# 对摄像头实时视频流做畸变矫正
def distortion_correction_cam():
    cap = cv2.VideoCapture(0)

    # 获取摄像头读取画面的宽和高
    width = cap.get(3)
    height = cap.get(4)
    fps = cap.get(5)
    print(width, height, fps)  # 640.0 480.0 30.0

    # 在这里把摄像头的分辨率修改为和我们标定时使用的一样的分辨率 1280x720
    cap.set(3, 1280)
    cap.set(4, 720)
    width = cap.get(3)
    height = cap.get(4)
    print(width, height, fps)  # 1280.0 720.0 30.0


    while (cap.isOpened()):
        ret, frame = cap.read()
        print(frame.shape)
        undistort_frame = undistort(frame)
        compare = np.hstack((frame, undistort_frame))
        cv2.imshow('frame', compare)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

重新设置分辨率后,矫正前后画面对比,可以看到几乎是没有横向或纵向拉伸的!

参考:

https://blog.csdn.net/weixin_40516558/article/details/103494029

https://blog.csdn.net/guaiderzhu1314/article/details/96306509

https://www.codenong.com/cs110623399/

到此这篇关于使用python opencv对畸变图像进行矫正的实现的文章就介绍到这了,更多相关python opencv畸变图像矫正内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python ConfigParser库的使用及遇到的坑

    python ConfigParser库的使用及遇到的坑

    这篇文章主要介绍了python ConfigParser库的使用及遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Pandas之MultiIndex对象的示例详解

    Pandas之MultiIndex对象的示例详解

    这篇文章主要介绍了Pandas之MultiIndex对象的示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 在ipython notebook中使用argparse方式

    在ipython notebook中使用argparse方式

    这篇文章主要介绍了在ipython notebook中使用argparse方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python自动化之实现桌面壁纸下载器

    Python自动化之实现桌面壁纸下载器

    随着计算机性能的提升,人们对计算机个性化的要求也越来越高了,自己使用的计算机当然要设置成自己喜欢的风格!本文就来用Python做个桌面壁纸下载器,需要的可以参考一下
    2022-11-11
  • Python线程之如何解决共享变量问题

    Python线程之如何解决共享变量问题

    这篇文章主要介绍了Python线程之如何解决共享变量问题,掐灭问我们学习了银行转账的这个场景,本文解决上次多个线程的操作都更改了amount变量导致运行结果不对的问题,需要的朋友可以参考一下
    2022-02-02
  • Python中读取和加解密PDF文件的详细教程

    Python中读取和加解密PDF文件的详细教程

    在Python中读取和加密PDF文件是一项常见且实用的任务,尤其对于需要处理大量文档自动化处理的场景,本文将详细介绍如何使用Python读取PDF文件内容以及如何使用不同的库来给PDF文件加密,需要的朋友可以参考下
    2024-08-08
  • Pytorch 实现focal_loss 多类别和二分类示例

    Pytorch 实现focal_loss 多类别和二分类示例

    今天小编就为大家分享一篇Pytorch 实现focal_loss 多类别和二分类示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python lambda表达式原理及用法解析

    Python lambda表达式原理及用法解析

    这篇文章主要介绍了Python lambda表达式原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Python基于高斯消元法计算线性方程组示例

    Python基于高斯消元法计算线性方程组示例

    这篇文章主要介绍了Python基于高斯消元法计算线性方程组,结合实例形式分析了Python高斯消元法针对方程组求解的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • python之pygame模块实现飞机大战完整代码

    python之pygame模块实现飞机大战完整代码

    这篇文章主要为大家详细介绍了python之pygame模块实现飞机大战完整代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11

最新评论