python 双目相机矫正代码

关于双目相机的矫正功能,博主有c++和python 的代码片。 python的比较简洁,一目了然。 整理一下放在这里。

需要的人可以自取,希望已经造好的轮子可以帮助大家节省开发时间,去做更多的事情。

如果搬运代码到自己的博客,希望注明出处:https://editor.csdn.net/md?not_checkout=1&spm=1001.2014.3001.9614&articleId=134178030

尊重作者的心血,谢谢!
点赞关注收藏


import cv2
import numpy as np
import scipy.io as sio
import os
import pandas as pd
import pdb
dirpic = 'C:/Users/Administrator/Desktop/parameter/l/'
dirpicR = 'C:/Users/Administrator/Desktop/parameter/r/'#读取文件夹中的所有图像,依次做计算处理
pic_name = os.listdir(dirpic)
pic_nameR = os.listdir(dirpicR)
#以下六项是已知的相机的标定参数文件
load_R = 'C:/Users/Administrator/Desktop/R.mat'
load_T = 'C:/Users/Administrator/Desktop/T.mat'
load_Ml = 'C:/Users/Administrator/Desktop/Ml.mat'
load_Mr = 'C:/Users/Administrator/Desktop/Mr.mat'
load_Dl = 'C:/Users/Administrator/Desktop/Dl.mat'
load_Dr = 'C:/Users/Administrator/Desktop/Dr.mat'R = sio.loadmat(load_R)['R']
T = sio.loadmat(load_T)['T']
left_camera_matrix = sio.loadmat(load_Ml)['ML']
right_camera_matrix = sio.loadmat(load_Mr)['MR']
left_distortion = sio.loadmat(load_Dl)['DL']
right_distortion = sio.loadmat(load_Dr)['DR']
frame= cv2.imread('C:/Users/Administrator/Desktop/l/'+pic_name[0])
h, w  = frame.shape[:2]
size = (w,h)
size1 = (w,h)
#立体校正环节,求矩阵
R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv2.stereoRectify(left_camera_matrix, left_distortion,right_camera_matrix, right_distortion, size, R,T,flags=cv2.CALIB_ZERO_DISPARITY,alpha=1)
#左右相机图像变换关系
left_map1, left_map2 = cv2.initUndistortRectifyMap(left_camera_matrix, left_distortion, R1, P1, size1, 5)
right_map1, right_map2 = cv2.initUndistortRectifyMap(right_camera_matrix, right_distortion, R2, P2, size1, 5)def stereocab(pic_namel,pic_namer,i):frame1= cv2.imread('C:/Users/Administrator/Desktop/parameter/photocab/l/'+pic_namel,0)frame2= cv2.imread('C:/Users/Administrator/Desktop/parameter/photocab/r/'+pic_namer,0)   #根据变换关系与原图像,求得校正后的目标图像img1_rectified = cv2.remap(frame1, left_map1, left_map2,  cv2.INTER_CUBIC)img2_rectified = cv2.remap(frame2, right_map1, right_map2,  cv2.INTER_CUBIC)cv2.imwrite('C:/Users/Administrator/Desktop/parameter/photocab/l/cl'+str(i)+'.jpg',img1_rectified)cv2.imwrite('C:/Users/Administrator/Desktop/parameter/photocab/r/cr'+str(i)+'.jpg',img2_rectified)for i in range(len(pic_name)):stereocab(pic_name[i],pic_nameR[i],i)

这里用到了比较关键的函数stereoRectify()与initUndistortRectifyMap()

极线矫正,也就是把两幅图的极线搞成水平,把任意位置的像平面,搞成两个平行的像平面

    双目相机的立体校正stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imageSize, R, T[, R1[, R2[, P1[, P2[, Q[,  flags[, alpha[, newImageSize]]]]]]]])-> R1, R2, P1, P2, Q, validPixROI1, validPixROI2cameraMatrix1 第一个摄像机的摄像机矩阵,即左相机相机内参矩阵,矩阵第三行格式应该为 0 0 1distCoeffs1    第一个摄像机的畸变向量cameraMatrix2  第一个摄像机的摄像机矩阵,即右相机相机内参矩阵,矩阵第三行格式应该为 0 0 1distCoeffs2    第二个摄像机的畸变向量imageSize      图像大小R-             相机之间的旋转矩阵,这里R的意义是:相机1通过变换R到达相机2的位姿 划重点!!!T-             左相机到右相机的平移矩阵R1             输出矩阵,第一个摄像机的校正变换矩阵(旋转变换)R2             输出矩阵,第二个摄像机的校正变换矩阵(旋转矩阵)P1             输出矩阵,第一个摄像机在新坐标系下的投影矩阵P2             输出矩阵,第二个摄像机在想坐标系下的投影矩阵Q              4*4的深度差异映射矩阵flags          可选的标志有两种零或者 CV_CALIB_ZERO_DISPARITY ,如果设置 CV_CALIB_ZERO_DISPARITY 的话,该函数会让两幅校正后的图像的主点有相同的像素坐标。否则该函数会水平或垂直的移动图像,以使得其有用的范围最大alpha          拉伸参数。如果设置为负或忽略,将不进行拉伸。如果设置为0,那么校正后图像只有有效的部分会被显示(没有黑色的部分),如果设置为1,那么就会显示整个图像。设置为0~1之间的某个值,其效果也居于两者之间。newImageSize   校正后的图像分辨率,默认为原分辨率大小。validPixROI1   可选的输出参数,Rect型数据。其内部的所有像素都有效validPixROI2   可选的输出参数,Rect型数据。其内部的所有像素都有效Rl, Rr, Pl, Pr, Q, validPixROIl, validPixROIr =  cv2.stereoRectify(cameraModel['Ml'], cameraModel['dl'], cameraModel['Mr'], cameraModel['dr'], (w ,h), cameraModel['R'], cameraModel['T'])mapl_1, mapl_2 = cv2.initUndistortRectifyMap(cameraModel['Ml'], cameraModel['dl'], Rl, Pl, (w,h), cv2.CV_32FC1)mapr_1, mapr_2 = cv2.initUndistortRectifyMap(cameraModel['Mr'], cameraModel['dr'], Rr, Pr, (w,h), cv2.CV_32FC1)initUndistortRectifyMap()计算计算未失真和校正变换映射cameraMatrix——输入的摄像头内参数矩阵(3X3矩阵)distCoeffs——输入的摄像头畸变系数矩阵(5X1矩阵)R——输入的第一和第二摄像头坐标系之间的旋转矩阵newCameraMatrix——输入的校正后的3X3摄像机矩阵size——摄像头采集的无失真图像尺寸m1type——map1的数据类型,可以是CV_32FC1或CV_16SC2map1——输出的X坐标重映射参数map2——输出的Y坐标重映射参数

看到这里了,点赞关注收藏一下吧,谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建mono-repo风格的脚手架库

前段时间阅读了 https://juejin.cn/post/7260144602471776311#heading-25 这篇文章;本文做一个梳理和笔记; 主要聚焦的知识点如下: 如何搭建脚手架工程如何开发调试如何处理命令行参数如何实现用户交互如何拷贝文件夹或文件如何动态生成文件…

Linux内核input子系统详解

目录 1 input子系统整体架构 2 input子系统驱动框架分析 2.1 怎么添加input_dev 2.2 input_dev和input_handler匹配后,connec函数做了什么 3 input子系统读数据流程 3.1 open输入设备流程 3.2 read读取输入事件流程 4 应用程序读取的输入数据是怎样的 4.1 …

chap认证带客户端IP分配案例

PPP协议两边的网段可以不在同一个网段,因为数据链路帧用0xff表示帧,不用arp,所以可以不同网段。 R1: aaa local-user test password cipher admin local-user test service-type ppp interface Serial4/0/0 link-protocol ppp pp…

Git 标签(Tag)实战:打标签和删除标签的步骤指南

目录 前言使用 Git 打本地和远程标签(Tag)删除本地和远程 Git 标签(Tag)开源项目标签(Tag)实战打标签删除标签 结语开源微服务商城项目前后端分离项目 前言 在开源项目中,版本控制是至关重要的…

在钣金加工领域,迅镭激光切割机广泛使用的原因和优点何在?

激光切割工艺和激光切割设备正在被广泛的板材加工企业逐渐理解并接受,凭借其高效率的加工、高精度的加工、优质的切割断面、三维切割能力等诸多优势,逐步取代了传统的钣金切割设备。 苏州迅镭激光科技有限公司推出的激光切割设备的柔性化程度高&#xff…

Centos下用nodejs实现一个简单的web服务器

WebRTC是音视频直播中最常用的一个框架,在使用的过程中,我们就需要实现一个服务器端。本文以nodejs实现一个服务器为例,讲述一下在centos下如何用nodejs实现一个简单的web服务器。 一、安装nodejs 在linux环境下安装nodejs有多重方式&#x…

python转xml为json

以下代码取自获取PA防火墙策略XML文件并转为JSON文件的场景: 通过PA防火墙API获取防火墙策略 防火墙策略xpath为./result/security/rules/entry 以下代码实现将所有entry即策略与策略相关属性转为json对象并存储至文件 import xml.etree.ElementTree as ET import …

Tomcat为什么支持线程池?

Tomcat作为一个Java Servlet容器,支持线程池是因为它能够处理多个并发请求。这些请求可以是对Web应用程序的HTTP请求、Servlet的请求,或其他支持的协议。 支持线程池的主要原因包括: 并发处理能力: 提高性能: 使用线程…

消息中间件——RabbitMQ(二)各大主流消息中间件综合对比介绍!

前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka&a…

函数参数的最佳传递方式与现代C++的规则

函数参数的最佳传递方式与现代C的规则 在C中,如何最佳地传递函数参数以及如何处理类的特殊成员函数,一直是优化性能和代码质量的重要话题。下面我将详细解释这些概念。 使用移动语义实现 Swap 函数 移动语义(Move Semantics)能…

数据库概述 -- 数据模型知识点要点详解

数据模型 概述概念数据特征组成要素分类概念层数据模型逻辑层数据模型物理层数据模型 主页传送门:📀 传送 概述 数据模型是对现实世界数据特征的抽象,它描述了数据的结构、操作和约束条件,为数据库系统的信息表示与操作提供一个抽…

JWT

目录 JWT组成 第一部分header 第二部分payload 第三部分signature 注意 JWT认证算法:签发和校验 drf使用jwt drf项目的jwt认证开发流程 drf-jwt安装和简单使用 安装 简单使用 drf-jwt使用 jwt内置类JSONWebTokenAuthentication 控制使用jwt的登录接口…

【计算机网络】计算机网络和因特网

一.基本术语介绍 端系统通过通信链路(communication link)和分组交换机(packet switch)连接到一起,连接这些端系统和分组交换机的物理媒体包括:同轴电缆,铜线,光纤和无线电频谱。而…

人工智能基础_机器学习014_BGD批量梯度下降公式更新_进一步推导_SGD随机梯度下降和MBGD小批量梯度下降公式进一步推导---人工智能工作笔记0054

然后我们先来看BGD批量梯度下降,可以看到这里,其实这个公式来源于 梯度下降的公式对吧,其实就是对原始梯度下降公式求偏导以后的梯度下降公式,然后 使用所有样本进行梯度下降得来的,可以看到* 1/n 其实就是求了一个平均数对吧.所有样本的平均数. 然后我们看,我们这里* 1/n那么…

Istio实战(十二)-Istio 延长自签发证书的有效期

因为历史原因,Istio 的自签发证书只有一年的有效期。如果你选择使用 Istio 的自签发证书,就需要在它们过期之前订好计划进行根证书的更迭。根证书过期可能会导致集群范围内的意外中断。 我们认为每年更换根证书和密钥是一个安全方面的最佳实践,我们会在后续内容中介绍如何完…

启用NTP服务解决Linux系统时间与北京时间不同步问题

一、背景 1、服务器的Linux版本为Linux version 4.18.0-348.7.1.el8_5.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 8.5.0 20210514 (Red Hat 8.5.0-4) (GCC)) #1 SMP Wed Dec 22 13:25:12 UTC 2021 2、NTP即Network Time Protocol(网络时间协议&am…

webpack 与 grunt、gulp 的不同?

结论先行: Webpack、Grunt 和 Gulp 都是前端开发中常用的构建工具,但是 Webpack 是基于模块化打包的工具,并支持模块化开发。而 Grunt 和 Gulp 都是基于任务的构建工具,自动执行指定的任务,但不支持模块化开发。 1、相…

JavaScript设计模式之适配器模式

一般为了解决不兼容的问题,把一个类的接口换成我们想要的接口,类似于转换器。 举个例子: 我想听歌的时候,我发现我没带耳机,我的手机是 iphone 的,而现在我只有一个 Type-C 的耳机,为了能够听歌…

Unity3D与iOS的交互 简单版开箱即用

本文适合的情况如下: Unity客户端人员 与 IOS端研发人员合作的情况 目录 From U3D to iOS 实现原理 1.unity工程目录创建2个文件 NativeCallProxy.m、NativeCallProxy.h 并且放到Unity工程目录Plugins/iOS/unity_ios_plus目录下 2.创建C#调用脚本 定义对应.mm脚…

sql常用语句笔记

增&#xff1a;INSERT INTO <表名> &#xff08;列名&#xff09;VALUES (值) (1)增加&#xff1a; 新增 INSERT INTO 表名 &#xff08;列&#xff09;values (值)&#xff0c;值一一对应列的位置&#xff0c;没写的列值会自动填入null或默认值 eg: INSERT INTO student…