python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > 双目摄像头Matlab参数定标

手把手教会你双目摄像头Matlab参数定标

作者:iNBC

双目标定是立体视觉系统中的一个关键步骤,下面这篇文章主要给大家介绍了关于双目摄像头Matlab参数定标的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

一、前期准备

1、安装好python3,可以在anaconda中安装python3。

2、一个合适的双目摄像头。

3、一台可以运行Matlab的电脑。

4、一张棋盘图(可A4打印,若效果不佳,则可A3打印)。

棋盘图如下图所示:需要测量小方框的边长(一般单位为毫米:mm)。

请添加图片描述

二、使用双目摄像头(左+右)拍摄棋盘图

1、注意事项

注意:

1、左、右摄像头图像中必须包含单独的完整的棋盘图。

2、可适当前后、左右、上下翻转棋盘图,在符合上述条件1的情况下。

3、拍摄左右双目的照片40~50张比较合适。

如图所示:

2、双目拍照代码(python)

take_photo.py内容如下:

import cv2
import sys
#引入库

cap = cv2.VideoCapture(1) #读取笔记本内置摄像头或者0号摄像头


i = 0
while True:
    ret, frame = cap.read()
    
    if (ret):
        cv2.namedWindow("Video01",0)   #创建一个名为Video01的窗口,0表示窗口大小可调
        #cv2.resizeWindow("Video01",1280,720) ##创建一个名为Video01的窗口,设置窗口大小为 1920 * 1080 与上一个设置的 0 有冲突
        cv2.imshow("Video01", frame)

        #等待按键按下
        c = cv2.waitKey(1) & 0xff

        #r若按下w则保存一张照片
        if c ==ord("w"):
            cv2.imwrite("./val_001/%d.bmp" %i, frame) #自己设置拍摄的照片的存储位置
            print("Save images %d succeed!" %i)
            i+=1

        #若按下Q键,则退出循环
        if c == ord("q"):
            break
    
#随时准备按q退出
cap.release()
#关掉所有窗口
cv2.destroyAllWindows()

注意:

1、运行take_photo.py前,注意设置左右照片的存储位置。

2、运行take_photo.py后,按下键盘上的“W”键拍摄一张照片。当拍摄的照片数量足够时,按下“Q”键退出程序运行。

3、程序退出后,打开存储照片的文件夹查看照片是否合适。

3、双目左右照片分割(python)

resize.py内容如下:

import numpy as np
import cv2

#img1 = cv2.imread(r"/Users/inbc/Desktop/zuo/Left1.bmp")
#img2 = cv2.imread(r"/Users/inbc/Desktop/you/Right1.bmp")
for i in range(0,7) :
    #imgT = cv2.imdecode(np.fromfile('./images/%d.bmp'  %i ,dtype=np.uint8), -1)
    imgT = cv2.imdecode(np.fromfile('./val/%d.bmp'  %i ,dtype=np.uint8), -1) #读取拍摄的左右双目照片

    # cv2.imshow("zuo", img1[300:1200, 500:2000])
    # cv2.imshow("you", img2[300:1200, 500:2000])

    # cv2.waitKey(0)
    
    #设置左右照片的存储位置
    cv2.imwrite("./val/zuo/reLeft%d.bmp"  %i  ,imgT[0:720, 0:1280] )#imgL的第一个参数是图片高度像素范围,第二个参数是图片宽度的像素范围
    cv2.imwrite("./val/you/reRight%d.bmp" %i ,imgT[0:720, 1280:2560] )
    print("Resize images%d Fnished!" %i)

print("Fnished All!!!")

注意:

1、运行resize.py前,注意设置左、右照片的分别的存储位置。

2、运行resize.py后,终端打印"Fnished All!!!"表示分割完成。

3、程序退出后,打开存储照片的文件夹查看照片,是否分割完成,左摄像头照片存放在zuo,右摄像头照片存放在you。(文件名可自己更改)

三、Matlab双目参数标定

1、打开Matlab后,点开app,找到Stereo Camera Calibrator。如下图所示:

打开后如图所示:

2、导入双目的左右照片到Stereo Camera CalibratorAPP。具体操作,如下图所示:

3、点击确认后就可以分析导入的左右的照片了。这个过程会自动剔除掉不合格(误差过大)的左右照片。

4、导入照片后就可以进行双目定标了。

导入左右照片后,如图所示:

5、设置双目相机的定标参数,如图所示。

6、进行双目定标,并导出双目参数矩阵到Matlab中,进行下一步的处理。

四、双目参数提取

1、左、右相机内参数获取,注意参数矩阵的转置:

>> stereoParams.CameraParameters1.IntrinsicMatrix'#左相机参数

ans =

  831.0889   -4.0855  659.4243
         0  831.8663  487.3259
         0         0    1.0000

>> stereoParams.CameraParameters2.IntrinsicMatrix'#右相机参数

ans =

  831.1982   -3.5773  632.5308
         0  832.1221  479.3084
         0         0    1.0000

Matlab如图所示:

请添加图片描述

2、获取左右相机畸变系数。

注意: 左右相机畸变系数:[k1, k2, p1, p2, k3] ,顺序要正确。

 # 左右相机畸变系数:[k1, k2, p1, p2, k3]

>> stereoParams.CameraParameters1.RadialDistortion

ans =

   -0.0806    0.3806   -0.5229 #k1  k2  k3

>> stereoParams.CameraParameters1.TangentialDistortion

ans =

   -0.0033    0.0005    #p1     p2

Matlab如图所示:

请添加图片描述

3、获取双目的旋转矩阵和平移矩阵,注意旋转矩阵的转置。

 # 旋转矩阵
>> stereoParams.RotationOfCamera2'

ans =

    1.0000    0.0017   -0.0093
   -0.0018    1.0000   -0.0019
    0.0093    0.0019    1.0000
    
 # 平移矩阵
>> stereoParams.TranslationOfCamera2

ans =

 -119.9578    0.1121   -0.2134

Matlab如图所示:

请添加图片描述

4、获取基线距离,单位:mm, 为平移向量的第一个参数(取绝对值)。

 self.baseline = 119.9578 # 单位:mm, 为平移向量的第一个参数(取绝对值)

至此,双目摄像头的参数就定标完了。

耐心一点,慢慢来总会成功的!!!

总结

到此这篇关于双目摄像头Matlab参数定标的文章就介绍到这了,更多相关双目摄像头Matlab参数定标内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文