opencv 鱼眼图像的矫正(动态参数调整)

devtools/2024/9/24 10:49:37/

一:棋盘校准参数说明(内参)

棋盘校准的方法及代码很多,参见其他连接

1:内参矩阵

2:畸变系数

针对鱼眼相机此处是4个参数,在其校准代码中也可以知道,其通常的定义如下:

       data.camera_mat = np.eye(3, 3)data.dist_coeff = np.zeros((4, 1))

二:基于生成的参数D和K进行调整

直接上代码,

import os
import numpy as np
import cv2
#下面的值是来自棋盘格校准后的内参矩阵K
initial_camera_matrix = np.array([[389.3455401867884, 0.0, 630.3678577531273],[0.0, 388.5686773894828, 361.167452606629],[0.0, 0.0, 1.0]])camera_mat = np.array([[302.116935,0.0,521.926531],[  0.0, 358.512097, 363.652721],[  0.0, 0.0,     1.0      ]])#下面的值是来自棋盘格校准后的D
dist_coeff = np.array([[0.05648235312901486],[-0.024826520405491565],[-0.002416551582982325],[0.0010672440368159684]])def adjust_parameters(x):
# 获取当前滑动条的值fx = cv2.getTrackbarPos('fx', 'Parameters')/ 100.0 fy = cv2.getTrackbarPos('fy', 'Parameters')/ 100.0 cx = cv2.getTrackbarPos('cx', 'Parameters')/ 100.0 cy = cv2.getTrackbarPos('cy', 'Parameters')/ 100.0 k1 = cv2.getTrackbarPos('k1', 'Parameters') / 2000000  # 调整范围以便于滑动条控制k2 = cv2.getTrackbarPos('k2', 'Parameters') / 2000000p1 = cv2.getTrackbarPos('p1', 'Parameters') / 2000000p2 = cv2.getTrackbarPos('p2', 'Parameters') / 2000000# 更新相机矩阵和畸变系数new_camera_matrix = np.array([[fx, 0.0, cx],[0.0, fy, cy],[0.0, 0.0, 1.0]])new_distortion_coeff = np.array([[k1], [-k2], [-p1], [p2]])map1, map2 = cv2.fisheye.initUndistortRectifyMap(initial_camera_matrix, new_distortion_coeff, np.eye(3, 3), new_camera_matrix, (args.width * args.sizescale, args.height * args.sizescale), cv2.CV_16SC2) img = np.load("./calibrate_img/img_cam5.npy")print(new_camera_matrix)print(new_distortion_coeff)undistort_img = cv2.remap(img, map1, map2, cv2.INTER_LINEAR)undistort_img=cv2.resize(undistort_img,(img.shape[1],img.shape[0]))cv2.imshow("undistort_img",undistort_img)cv2.imshow("src_img",img)def main():cv2.namedWindow('Parameters')# 添加相机矩阵的滑动条cv2.createTrackbar('fx', 'Parameters', int(camera_mat[0, 0]* 10000), 90*100000, adjust_parameters)cv2.createTrackbar('fy', 'Parameters', int(camera_mat[1, 1]* 10000), 90*100000, adjust_parameters)cv2.createTrackbar('cx', 'Parameters', int(camera_mat[0, 2]* 10000), 90*1000000, adjust_parameters)cv2.createTrackbar('cy', 'Parameters', int(camera_mat[1, 2]* 10000), 90*100000, adjust_parameters)# 添加畸变系数的滑动条cv2.createTrackbar('k1', 'Parameters', int(dist_coeff[0, 0] * 100000), 4000000, adjust_parameters)cv2.createTrackbar('k2', 'Parameters', int(dist_coeff[1, 0] * 100000), 4000000, adjust_parameters)cv2.createTrackbar('p1', 'Parameters', int(dist_coeff[2, 0] * 100000), 4000000, adjust_parameters)cv2.createTrackbar('p2', 'Parameters', int(dist_coeff[3, 0] * 100000), 4000000, adjust_parameters)while True:key = cv2.waitKey(1) & 0xFFif key == ord('q'):breakcv2.destroyAllWindows()  if __name__ == '__main__':main()    


http://www.ppmy.cn/devtools/58101.html

相关文章

【基础算法总结】分治—归并

分治—归并 1.排序数组2.交易逆序对的总数3.计算右侧小于当前元素的个数4.翻转对 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.排序数组 …

LVS+keepalived群集

在这个高度信息化的 IT时代,企业的生产系统、业务运营、销售和支持,以及日常管理等环节越来越依赖于计算机信息和服务,对高可用(HA)技术的应用需求不断提高,以便提供持续的、不间断的计算机系统或网络服务。 本文将学习如…

【计算机】同步/异步

同步/异步 在计算机科学和编程中,“同步”(Synchronization)是一种机制,用于协调不同进程或线程之间的操作,以避免竞态条件(race conditions)、死锁(deadlocks)和其他并…

域名、网页、HTTP概述

目录 域名 概念 域名空间结构 域名注册 网页 概念 网站 主页 域名 HTTP URL URN URI HTML 超链接 发布 HTML HTML的结构 静态网页 特点 动态网页 特点 Web HTTP HTTP方法 GET方法 POST方法 HTTP状态码 生产环境下常见的HTTP状态码 域名 概念 IP地…

事件总线使用

创建一个eventBus.js import { reactive } from vue// 创建一个响应式的事件对象用于存储事件处理器 const eventBus reactive({})// 添加事件监听器的函数 function on(eventName, handler) {if (!eventBus[eventName]) {eventBus[eventName] []}eventBus[eventName].push(…

常见的设计模式

单例/工厂比较常见,不写了 1. 原型模式(Prototype Pattern) 定义:通过复制现有对象来创建新对象的一种方式,而不是通过实例化类。 适用场景: 当一个系统应该独立于它的产品创建、构成和表示时。要避免重…

虚拟机使用

1、安装 如何安装虚拟机?保姆级安装教程! - 知乎 (zhihu.com) 2、使用 2.1 快照 作用:保留当前系统信息为快照,随时可以恢复,以防未来系统被你玩坏,就好比游戏中的归档!每配置好一个就可以保…

Android与Java后端联调RSA加密的注意事项

项目中常常会遇到Android前端使用后端提供的公钥加密数据的场景。需要注意Java后端的java.util.Base64默认Base64标准和Android的android.util.Base64是不一样的。 此外,RSA算法标准也需要前后端显式约定。 示例代码: import android.util.Base64;impo…