python 双目相机矫正代码

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

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

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

尊重作者的心血,谢谢!

点赞关注收藏

python 复制代码
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, validPixROI2
     
    cameraMatrix1 第一个摄像机的摄像机矩阵,即左相机相机内参矩阵,矩阵第三行格式应该为 0 0 1
    distCoeffs1    第一个摄像机的畸变向量
    cameraMatrix2  第一个摄像机的摄像机矩阵,即右相机相机内参矩阵,矩阵第三行格式应该为 0 0 1
    distCoeffs2    第二个摄像机的畸变向量
    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_16SC2
 map1------输出的X坐标重映射参数
 map2------输出的Y坐标重映射参数

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

相关推荐
DisonTangor9 分钟前
阿里通义千问开源Qwen2.5系列模型:Qwen2-VL-72B媲美GPT-4
人工智能·计算机视觉
豆浩宇9 分钟前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr
Narutolxy11 分钟前
Python 单元测试:深入理解与实战应用20240919
python·单元测试·log4j
嵌入式杂谈18 分钟前
OpenCV计算机视觉:探索图片处理的多种操作
人工智能·opencv·计算机视觉
红米煮粥20 分钟前
图像处理-掩码
图像处理·opencv·计算机视觉
Amo Xiang34 分钟前
2024 Python3.10 系统入门+进阶(十五):文件及目录操作
开发语言·python
liangbm344 分钟前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
B站计算机毕业设计超人1 小时前
计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
爬虫·python·深度学习·算法·机器学习·自然语言处理·数据可视化
羊小猪~~1 小时前
深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)
人工智能·python·深度学习·学习·算法·机器学习·cnn
Zhangci]1 小时前
OpenCv(一)
人工智能·opencv·计算机视觉