1 Star 4 Fork 2

sss / Binocular measurement

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

双目立体视觉

一、介绍

通过两个Basler相机标定的相机内外参和畸变系数进行立体校正,获得去畸变后的双目参数。为了验证标定参数的精度,利用去畸变后的双目参数识别棋盘格标定板的角点间距,并计算与基准距离的绝对误差。最后双目相机拍摄光斑,能够得到左右相机下光斑的质心坐标,再利用双目立体视觉测量原理计算出光斑的三维坐标。

二、双目测量函数

测量算法

BinocularMeas.py

getStereoRectifyImageFromCameraParameters()

功能:通过双目相机的内外参数和畸变系数进行立体校正,获得去畸变后的双目参数和图像。

DEMO:
        import numpy as np
        import cv2
        import BinocularMeas as bl
      '''
        左相机内参flx,ul0,fly,ul0;
        右相机内参frx,ur0,fry,ur0;
        右相机到左相机的旋转矩阵:[r1,r2,r3,r4,r5,r6,r7,r8,r9];
        右相机到左相机的平移矩阵:[T1,T2,T3];
        左相机的畸变系数kl1,kl2,pl1,pl2,kl3;
        右相机的畸变系数kr1,kr2,pr1,pr2,kr3.
        P=([[flx,ul0,fly,ul0,
             frx,ur0,fry,ur0,
             r1,r2,r3,
             r4,r5,r6,
             r7,r8,r9,
             T1,T2,T3,
             kl1,kl2,pl1,pl2,kl3,
             kr1,kr2,pr1,pr2,kr3]])
       '''
       # 双目相机的内外参和畸变参数
        P= ( [[1.58194505e+03,6.11360774e+02,1.58103367e+03,4.81957409e+02,
            1.58550432e+03, 6.60125535e+02,1.58560729e+03 ,5.30058387e+02,
            0.99935972,0.00832822,-0.03479633,
            -0.00818233,0.99995714,0.00433311,
            0.03483093,-0.00404562,0.99938503,
            -1.45455737e+02,-1.00152336e-01,3.81513984e+00,
            -0.10048731,0.15942811,0.00067713,-0.00077331,0.02106416,
            -0.10669631,0.27109715,0.00093811,-0.00115607,-0.21457691]])
        P0,P1,Pl,Pr,rectifyImageL,rectifyImageR = bl.getStereoRectifyImageFromCameraParameters(P,grayImageL,grayImageR)
        print('左相机投影矩阵',P0)
        print('右相机投影矩阵',P1)
        print('校正后的左相机投影矩阵',Pl)
        print('校正后的右相机投影矩阵',Pr)
        print('校正后的左图像',rectifyImageL)
        print('校正后的右图像',rectifyImageR)

calCalibrationAccuracyFromCameraParameters()

功能:由双目相机的内外参和畸变参数对图像进行立体校正,对比原始和校正参数的坐标测量精度。

DEMO:
        import numpy as np
        import cv2
        from PIL import Image
        import matplotlib.pyplot as plt
        import BinocularMeas as bl
        # 双目相机的内外参和畸变参数
        P= ( [[1.58194505e+03,6.11360774e+02,1.58103367e+03,4.81957409e+02,
            1.58550432e+03, 6.60125535e+02,1.58560729e+03 ,5.30058387e+02,
            0.99935972,0.00832822,-0.03479633,
            -0.00818233,0.99995714,0.00433311,
            0.03483093,-0.00404562,0.99938503,
            -1.45455737e+02,-1.00152336e-01,3.81513984e+00,
            -0.10048731,0.15942811,0.00067713,-0.00077331,0.02106416,
            -0.10669631,0.27109715,0.00093811,-0.00115607,-0.21457691]])
        # 读取图片
        grayImageL = cv2.imread("L2.bmp", 0)
        grayImageR = cv2.imread("R2.bmp", 0)
        error=bl.calCalibrationAccuracyFromCameraParameters(P,grayImageL,grayImageR)
        print('测量棋盘格相邻角点间距和基准距离的绝对误差',error)

输出效果

校正前的标定板图片:

校正后的标定板图像:

通过双目标定的内外参计算出棋盘格角点的三维坐标,将校正前后识别的棋盘格相邻角点间距和基准距离的绝对误差作为相机标定精度的评定标准。校正前和校正后的坐标测量精度分别在1.1mm和0.15mm以内。

calCoordinateFromSpotcentroid()

功能:通过双目拍摄得到校正后离线的光斑图像,再由左右相机的质心坐标计算出光斑三维坐标。

DEMO:
        import numpy as np
        import cv2
        import BinocularMeas as bl
        # 双目相机的内外参和畸变参数
        P= ( [[1.58194505e+03,6.11360774e+02,1.58103367e+03,4.81957409e+02,
            1.58550432e+03, 6.60125535e+02,1.58560729e+03 ,5.30058387e+02,
            0.99935972,0.00832822,-0.03479633,
            -0.00818233,0.99995714,0.00433311,
            0.03483093,-0.00404562,0.99938503,
            -1.45455737e+02,-1.00152336e-01,3.81513984e+00,
            -0.10048731,0.15942811,0.00067713,-0.00077331,0.02106416,
            -0.10669631,0.27109715,0.00093811,-0.00115607,-0.21457691]])
        # 读取图片
        imgL = cv2.imread("L1.bmp", 0)
        imgR = cv2.imread("R1.bmp", 0)
        w=np.array(bl.calCoordinateFromSpotcentroid(P,imgL,imgR))
        print('光斑的三维坐标',w)

输出效果

显示左右相机图像去畸变后识别的光斑质心坐标如下图所示。

getSpotCoordinateFromCamera

功能:通过两个BASLER相机拍摄光斑,实时获取光斑的质心坐标和三维坐标。

DEMO:
        import numpy as np
        import cv2
        import BinocularMeas as bl
        from pypylon import pylon
        import time
        # 双目相机的内外参和畸变参数
        P= ( [[1.58194505e+03,6.11360774e+02,1.58103367e+03,4.81957409e+02,
        1.58550432e+03, 6.60125535e+02,1.58560729e+03 ,5.30058387e+02,
        0.99935972,0.00832822,-0.03479633,
        -0.00818233,0.99995714,0.00433311,
        0.03483093,-0.00404562,0.99938503,
        -1.45455737e+02,-1.00152336e-01,3.81513984e+00,
        -0.10048731,0.15942811,0.00067713,-0.00077331,0.02106416,
        -0.10669631,0.27109715,0.00093811,-0.00115607,-0.21457691]])
	# 实时测量光斑的三维坐标
        centerlistL,centerlistR,coordinate=bl.getSpotcentroidFromCamera(P)
        # 输出光斑的左右质心和三维坐标
        print(centerlistL,centerlistR,coordinate)

主函数

measure.py

功能:读取txt文件中的双目相机内外参数,首先验证校正后的坐标测量精度,再利用两个Basler相机拍摄图像识别光斑质心,最后求出光斑的三维坐标。

输出:双目标定参数的坐标测量精度和光斑的三维坐标。

三、实验

双目视觉测量系统标定场景如下图所示:

硬件名称 技术参数
工业相机 左相机型号: Basler acA1300-60gm
右相机型号: Basler acA1300-60gmNIR
分辨率:1280px * 1024px
像元大小:5.3μm * 5.3μm
背光棋盘格标定板 方格边长:30mm
图案阵列:15*11

双目相机标定实验

在实验过程中使用棋盘格标定板进行双目相机参数的标定。第一步,调整相机的曝光和焦距,让相机能够清楚的拍摄棋盘格角点;第二步,相机的两个相拍摄标定板,标定板一定要在两个相机的视野内;第三步,改变标定板的姿态,拍摄15到20张图片;第四步,使用MATLAB中的立体标定对双目进行标定。

左相机拍摄的标定板图片如下所示:

右相机拍摄的标定板图片如下所示:

光斑的重复性实验

实验环境如下图所示:

双目相机距离灯珠3.5米,通过拍摄单个灯珠,验证光斑左右相机质心坐标和三维坐标的重复性。ul在0.03个像素内波动,vl在0.04个像素内波动,ur在0.035个像素内波动,vr在0.055个像素内波动。光斑三维坐标X在0.022mm以内,Y在0.03mm以内,Z在0.15mm以内波动。重复性实验数据如下表所示:

左相机质心坐标UL(pixel) 左相机质心坐标VL(pixel) 右相机质心坐标UR(pixel) 右相机质心坐标VR(pixel) 光斑X轴坐标(mm) 光斑Y轴坐标(mm) 光斑Z轴坐标(mm)
最大值 212.593 475.629 1056.501 518.816 346.74 31.901 -3377.45
最小值 212.563 475.587 1056.45 518.729 346.709 31.851 -3377.74
平均值 212.5656 475.6245 1056.469 518.7831 346.7309 31.87104 -3377.59
标准差 0.00711 0.012657 0.015512 0.023158 0.008203 0.014259 0.064868

空文件

简介

通过双目相机拍摄的光斑质心计算出光斑的三维坐标。 展开 收起
Python
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/sdsdsd123/binocular-measurement.git
git@gitee.com:sdsdsd123/binocular-measurement.git
sdsdsd123
binocular-measurement
Binocular measurement
master

搜索帮助