1 Star 1 Fork 1

hunter206206 / BinocularMeasurement

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

原理

利用双相机对统一被测目标进行拍摄,基于左右相机内外参数,计算被测目标的空间三维坐标,如下图所示:

标定

双目相机在使用前需要对内/外参数进行精确标定,可参考标定文档。

测量

在通过标定获取到内外参数后,可利用双目相继对单一目标进行空间三维坐标的精确测量。以实现单个红外LED发光点的空间三维坐标为例,运行命令: python3 calXYZ.py

得到如下结果

实验

棋盘格角点间距离测量精度比对实验

导轨基准距离测量精度比对实验

测量算法

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]])
        # 图片分辨率
        imageSize=(1280,1024)
        P0,P1,Pl,Pr,mapLx,mapLy,mapRx,mapRy = bl.getStereoRectifyImageFromCameraParameters(P, imageSize)
        print('左相机投影矩阵',P0)
        print('右相机投影矩阵',P1)
        print('校正后的左相机投影矩阵',Pl)
        print('校正后的右相机投影矩阵',Pr)
        print('左相机(x,y)映射',mapLx,mapLy)
        print('右相机(x,y)映射',mapRx,mapRy)

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)

输出效果

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

主函数

measure.py

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

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

三、实验

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

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

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

空文件

简介

双目视觉测量 展开 收起
Python
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/huangzhexiaohao/BinocularMeasurement.git
git@gitee.com:huangzhexiaohao/BinocularMeasurement.git
huangzhexiaohao
BinocularMeasurement
BinocularMeasurement
master

搜索帮助