使用python opencv对畸变图像进行矫正的实现
作者:燕阳天 发布时间:2021-08-18 01:09:44
标签: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/
来源:https://juejin.cn/post/7094064438243753991


猜你喜欢
- 本文实例分析了python开发之str.format()用法。分享给大家供大家参考,具体如下:格式化一个字符串的输出结果,我们在很多地方都可
- 1,exists和in的理解(参考https://www.jb51.net/article/28922.htm) exists:如果子查询中
- PDO::setAttributePDO::setAttribute — 设置属性(PHP 5 >= 5.1.0, PECL pdo
- Psyco 是严格地在 Python 运行时进行操作的。也就是说,Python 源代码是通过 python 命令编译成字节码的,所用的方式和
- 在实用美术中,常有"远看色彩近看花,先看颜色后看花,七分颜色三分花"的说法。这也就说明,在任何设计中,色彩对视觉的刺激起
- SQL Server数据库如何获取TEXT字段的内容长度的方法,是通过DATALENGTH函数来实现的,接下来我们就通过DATALENGTH
- 比如我们有一张school表,里面有一个字段county_name,现在我们要查询county_name字段中包含a-w字母和数字以外字符的
- 可以用两种方式创建MySQL账户:1.使用GRANT语句2.直接操作MySQL授权表最好的方法是使用GRANT语句,因为这样更精确,错误少。
- 使用cv2.canny进行图像边缘检测CV2提供了提取图像边缘的函数canny。其算法思想如下:1.使用高斯模糊,去除噪音点(cv2.Gau
- 树的实质是很多条数据按照一定的内在关系,分层级显示出来。因此每一条数据包括数据项和相互关系。数据项就对应了树中的column,而相互关系对应
- 1. orm读写数据1. 创建1.1. 创建记录user := User{Name: "Jinzhu", Age: 18
- tf.nn.conv2d与tf.layers.conv2d的区别在写CNN中注意到tensorflow目前有tf.nn.conv2d和tf.
- 两段使用键盘的上下键进行选择的代码:<Script Language="JScript"> &
- Python有一随机函数可以产生[0,1)区间内的随机数,基于此函数生成随机分布在任意三角形内的点由数学知识得知:几何体的向量表达形式直线:
- 本文实例讲述了Python显示进度条的方法,是Python程序设计中非常实用的技巧。分享给大家供大家参考。具体方法如下:首先,进度条和一般的
- 如何导入自己的模块在实际的编程生活当中,我们除了会去import已经存在的包外,当然还会偶尔自定义一些模块,然后来导入,其实一般而言,自定义
- function map(a,f){f(a);} function getRand(a,b) {  
- Dreamweaver出现乱码,大致为两种情况:一是没有标明主页制作所用的文字,这种情况下很简单就可以
- Django添加静态文件有两种方法:首先setting.py配置文件中添加静态文件的路径:STATICFILES_DIRS = [ os.p
- PhantomJS作为常用获取页面的工具之一,我们已经讲过页面测试、代码评估和捕获屏幕这几种使用的方式。当然最厉害的还是网页方面的捕捉,这里