Python opencv对图像矫正的代码怎样写
Admin 2022-09-03 群英技术资讯 288 次浏览
__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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了python实战之利用pygame实现贪吃蛇游戏,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好的帮助哟,需要的朋友可以参考下
PyQt提供了一个设计良好的窗口控件集合,具有更方便的操作性。学过VB的同学会知道,相比与VB的使用,在界面设计上元素更丰富,这篇文章主要介绍了基于PyQt5完成的图转文功能,需要的朋友可以参考下
本篇文章给大家带来了关于Python的相关知识,KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,是一个概念极其简单,而分类效果又很优秀的分类算法,下面一起来看一下,希望对大家有帮助。
python中集合set是一个无序不重复元素的集,基本功能包括关系测试和消除重复元素,还可以计算交集、差集、并集等,它与列表(list)的行为类似,这篇文章主要介绍了python set()去重的底层原理,需要的朋友可以参考下
这篇文章主要介绍了python中列表添加的四种方法小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008