Python opencv对图像矫正的代码怎样写
Admin 2022-09-03 群英技术资讯 1053 次浏览
这篇文章主要讲解了“ Python opencv对图像矫正的代码怎样写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ 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/
pubDate 2022-05-07 category python tag opencv图像矫正 description 本文主要介绍了使用python opencv对畸变图像进行矫正的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 keywords opencv图像矫正
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分开来。灰度化处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。阈值化处理可以将图像中的像素划分为两类颜色,常见的阈值化算法如公式(1)所示:
很多朋友应该都有看到过,很多小图片拼接成为一个完整大图片的这样的效果,那么这是怎么做的呢?下面小编就给大家分享使用python来实现固定尺寸图像拼接。感兴趣的朋友可以参考学习。
本文总结了如何获得SSL证书并给Django项目配置HTTPS,建议先收藏再阅读,将来有一天你很可能会用到它。
getattr是python里的一个内建函数getattr()这个方法最主要的作用是实现反射机制。也就是说可以通过字符串获取方法实例。这样,你就可以把一个类可能要调用的方法放在配置文件里,在需要的时候动态加载。python里面跟getattr相关的有hasattr,setattr,delattr ,那么我们通过下面的例子,来详细的说说他们的用法。1classXiaorui:2
本文主要介绍了Python数据分析Matplotlib柱状图绘制,Matplotlib提供了bar()方法绘制柱状图,下面具体绘制介绍需要的小伙伴可以参考以一下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008