脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 使用python opencv对畸变图像进行矫正的实现

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

2022-12-20 14:11燕阳天 Python

本文主要介绍了使用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()

对图片进行矫正效果:

原图:

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

矫正后的图片:

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

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

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

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

  • 矫正后的画面会被裁切,明显可以看到画面中的信息是有裁切的,例如左边的椅子已经被裁切掉了
  • 矫正后的画面和原画面是保持相同的分辨率: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()

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

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

 

参考:

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畸变图像矫正内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7094064438243753991

延伸 · 阅读

精彩推荐
  • PythonPyTorch搭建多项式回归模型(三)

    PyTorch搭建多项式回归模型(三)

    这篇文章主要为大家详细介绍了PyTorch搭建多项式回归模型,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Liam Coder7692021-06-28
  • PythonPython爬虫天气预报实例详解(小白入门)

    Python爬虫天气预报实例详解(小白入门)

    这篇文章主要介绍了Python爬虫天气预报实例详解(小白入门),详细介绍了整个爬虫建立的流程,最后分享了实现代码,很简洁,小编觉得还是挺不错的,...

    敲代码的猴9342021-01-08
  • PythonPython四大金刚之列表详解

    Python四大金刚之列表详解

    这篇文章主要介绍了Python的列表,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...

    43439292022-02-13
  • PythonPython实现批量采集商品数据的示例详解

    Python实现批量采集商品数据的示例详解

    这篇文章主要为大家详细介绍了如何利用Python实现批量采集商品的数据,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    魔王不会哭6782022-11-16
  • PythonWxPython建立批量录入框窗口

    WxPython建立批量录入框窗口

    这篇文章主要为大家详细介绍了WxPython建立批量录入框窗口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    陈年椰子8782021-06-03
  • PythonPython中的流程控制详解

    Python中的流程控制详解

    这篇文章主要介绍了Python中的流程控制的相关资料,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...

    flydean6362021-09-05
  • PythonTensorflow 训练自己的数据集将数据直接导入到内存

    Tensorflow 训练自己的数据集将数据直接导入到内存

    这篇文章主要介绍了Tensorflow 训练自己的数据集将数据直接导入到内存,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    ruyiweicas8792021-03-06
  • Python用Python Turtle画棵樱花树送给自己

    用Python Turtle画棵樱花树送给自己

    心情不好的时候,来用Python和Turtle库画棵樱花树送给自己吧,自己也要好好爱自己才对!文中的示例代码讲解详细,感兴趣的小伙伴可以动手试一试...

    盛夏温暖流年5442022-09-29