当前位置: 首页 > news >正文

【opencv】图像畸变校正

接上篇文章:【鱼眼+普通相机】相机标定

附代码:

方法一:

使用cv2.undistort

"""Create May 11, 2024@author Wang Jiajun
"""import cv2
import numpy as npdef correct(img,camera_file='E:/calib_yaml/ship_calib.yaml'):"""矫正图像,去除畸变img: 输入图像camera_file: 相机参数文件return: 矫正后的图像"""fs = cv2.FileStorage(camera_file, cv2.FILE_STORAGE_READ)camera_matrix = fs.getNode("camera_matrix").mat()dist_coeffs = fs.getNode("dist_coeffs").mat()  # 畸变参数--顺序很重要!!!:k1,k2,p1,p2,k3resolution = fs.getNode("resolution").mat()  # 图像分辨率imSize = (resolution[0][0], resolution[1][0])fs.release()# 矫正图像img_distort = cv2.undistort(img, np.array(camera_matrix), np.array(dist_coeffs))return img_distort if __name__ == '__main__':camera_file = 'E:/calib_yaml/ship_calib.yaml'video = cv2.VideoCapture(0)while True:ret, img = video.read()# 3. 矫正图像img = cv2.resize(img, (640, 480))cv2.putText(img, "Press q to exit", (20, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 200, 0), 2)img_distort = cv2.correct(img, camera_file )# 4. 显示原图和矫正后的图像cv2.imshow('img_original', img)cv2.imshow('img_distort', img_distort)key = cv2.waitKey(1)# 5. 按q退出if key & 0xFF == ord('q'):break# 6. 关闭窗口video.release()cv2.destroyAllWindows()

方法二:

使用cv2.initUndistortRectifyMap建立映射关系,就不用每次读取内参了,速度更快。

"""Create May 11, 2024@author Wang Jiajun
"""import cv2
import numpy as npdef correct(camera_file='E:/calib_yaml/ship_calib.yaml'):"""矫正图像,去除畸变img: 输入图像camera_file: 相机参数文件return: 矫正后的图像"""fs = cv2.FileStorage(camera_file, cv2.FILE_STORAGE_READ)camera_matrix = fs.getNode("camera_matrix").mat()dist_coeffs = fs.getNode("dist_coeffs").mat()  # 畸变参数--顺序很重要!!!:k1,k2,p1,p2,k3resolution = fs.getNode("resolution").mat()  # 图像分辨率imSize = (resolution[0][0], resolution[1][0])fs.release()# 矫正图像new_camera_matrix, roi = cv2.getOptimalNewCameraMatrix(np.array(camera_matrix), np.array(dist_coeffs),imSize, 0,imSize)map1, map2 = cv2.initUndistortRectifyMap(np.array(camera_matrix), np.array(dist_coeffs), None, new_camera_matrix,imSize, cv2.CV_32FC1)# img_distort = cv2.undistort(img, np.array(camera_matrix), np.array(dist_coeffs))return map1, map2if __name__ == '__main__':camera_file = 'E:/calib_yaml/ship_calib.yaml'map1, map2 = correct(camera_file)video = cv2.VideoCapture(0)while True:ret, img = video.read()# 3. 矫正图像img = cv2.resize(img, (640, 480))cv2.putText(img, "Press q to exit", (20, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 200, 0), 2)img_distort = cv2.remap(img, map1, map2, cv2.INTER_LINEAR)# 4. 显示原图和矫正后的图像cv2.imshow('img_original', img)cv2.imshow('img_distort', img_distort)key = cv2.waitKey(1)# 5. 按q退出if key & 0xFF == ord('q'):break# 6. 关闭窗口video.release()cv2.destroyAllWindows()
http://www.lryc.cn/news/349200.html

相关文章:

  • Charger之二输入电压动态电源原理(VIN-DPM)
  • 【半夜学习MySQL】表结构的操作(含表的创建、修改、删除操作,及如何查看表结构)
  • 曲线救国:window 安装 docker
  • 番外篇 | 利用PyQt5+YOLOv5来搭建目标检测系统(附可视化界面+功能介绍+源代码)
  • Pascal Content数据集
  • 【Unity】使用Resources.LoadAll读取文件的顺序问题
  • pdf怎么标注红色方框?五种PDF标注红色方框方法
  • C++字符串细节,面试题06
  • AutoModelForCausalLM.from_pretrained 函数调用本地权重报错
  • 【qt】动态属性
  • Git知识点总结
  • 【数据库】数据库指令
  • 设计模式——状态模式(State)
  • 理解打包好的vue项目结构dist包
  • 24深圳杯C题18页高质量论文+可执行代码+图表
  • Midjourney Imagine API 申请及使用
  • 电子邮箱是什么?怎么申请一个电子邮箱?
  • C++ 并发编程指南(11)原子操作 | 11.4、通过内存序实现顺序模型
  • 【数据结构】栈和队列专题
  • 2024年程序员最应该关注的几件事?
  • 【初阶数据结构】单链表基础OJ题讲解
  • 基于Java的俄罗斯方块游戏的设计与实现
  • Hadoop 3.4.0+HBase2.5.8+ZooKeeper3.8.4+Hive+Sqoop 分布式高可用集群部署安装 大数据系列二
  • umi搭建react项目
  • mybatis-plus之数据源切换事务失效问题
  • vue 百度地图点击marker修改marker图片,其他marker图片不变。
  • 【Javaer学习Python】 1、Django安装
  • SSL协议
  • 什么情况下会造成索引失效?
  • 间隔采样视频的代码