MATLAB张正友标记法对双目摄像头进行标定

第一步、安装MATLAB

我这里使用的版本是MATLAB R2016a
具体软件自己去度娘找哈
破解就花费了我大半天

第二步、去打印标定要用到的棋盘

这里可以给你(有点小水印无伤大雅)

MATLAB张正友标记法对双目摄像头进行标定_第1张图片

用A4纸打印出来

第四步、主角—双目摄像头

奉劝大家不要贪小便宜哈,得买个一百来块的,要不然数据极度不准确,而且还难用
我买了这个,150

MATLAB张正友标记法对双目摄像头进行标定_第2张图片

第五步、测试双目摄像头

打开你们可爱的pycharm
安装opencv
写入代码

import cv2

video = cv2.VideoCapture(1 + cv2.CAP_DSHOW)
width = 2560
high = 720
mid = width // 2
video.set(cv2.CAP_PROP_FRAME_WIDTH, width)
video.set(cv2.CAP_PROP_FRAME_HEIGHT, high)

w = video.get(cv2.CAP_PROP_FRAME_WIDTH)
h = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
while True:
    ret, frame = video.read()
    cv2.waitKey(10)
    left_img = frame[:, :mid]
    right_img = frame[:, mid:]
    cv2.imshow("left_img", left_img)
    cv2.imshow("right_img", right_img)

当你看到两个窗口弹出的时候,说明双目摄像头测试成功了

第六步、拍标定图

来来来、复制代码


import cv2

video = cv2.VideoCapture(1 + cv2.CAP_DSHOW)
width = 2560
high = 720
mid = width // 2
video.set(cv2.CAP_PROP_FRAME_WIDTH, width)
video.set(cv2.CAP_PROP_FRAME_HEIGHT, high)

w = video.get(cv2.CAP_PROP_FRAME_WIDTH)
h = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
index=1
index2=1
while True:
    ret, frame = video.read()
    left_img = frame[:, :mid]
    right_img = frame[:, mid:]
    cv2.imshow("left_img", left_img)
    cv2.imshow("right_img", right_img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('a'):
        cv2.imwrite("left"+str(index)+".jpg", left_img)
        print("success index="+str(index))
        index=index+1
    if k == ord('s'):
        cv2.imwrite("right"+str(index2)+".jpg", right_img)
        print("success index2="+str(index2))
        index2=index2+1

以上代码实现了
按下a键就左目拍照
按下s键就右目拍照
左右目各拍20张标定图

MATLAB张正友标记法对双目摄像头进行标定_第3张图片

第七步、使用MATLAB中的标定工具

MATLAB张正友标记法对双目摄像头进行标定_第4张图片
MATLAB张正友标记法对双目摄像头进行标定_第5张图片

一次性导入20张左目的照片

MATLAB张正友标记法对双目摄像头进行标定_第6张图片

这里填棋盘的宽度,我是A4纸打印的是24mm(尺子量的)
具体需要你们去亲自量一下啦

MATLAB张正友标记法对双目摄像头进行标定_第7张图片

等待MATLAB计算好就行啦

MATLAB张正友标记法对双目摄像头进行标定_第8张图片

标点计算完了就会告诉你有多少个是可以用的,有多少个是无效的图像

MATLAB张正友标记法对双目摄像头进行标定_第9张图片

第七步、计算相机数据值

点击Calibrate按钮就可以开始计算啦
MATLAB张正友标记法对双目摄像头进行标定_第10张图片
计算完毕就会看到你的相机的位置
上面的柱形图就是每个图片的误差
MATLAB张正友标记法对双目摄像头进行标定_第11张图片

!!!!!
我的有效图像居然只有七张!!!而且误差均值居然到了1.15!!!

重做ing!!!!
重做ing!!!!
重做ing!!!!
重做ing!!!!
重做ing!!!!

后来才发现1.15真的不高,在做了N次后发现1.15居然是最低的!!!
有些网站说误差需要小于0.5才可以通过,我有时候的误差可以到6!!经常性会到2点几
最后这次我做了有一点几,就果断导出数据了

按这个按钮导出到控制台
MATLAB张正友标记法对双目摄像头进行标定_第12张图片
然后就可以看到左目相机的数据
MATLAB张正友标记法对双目摄像头进行标定_第13张图片
接下来要看相机的内参矩阵,径向畸变和切向畸变。

内参矩阵

cameraParams.IntrinsicMatrix

MATLAB张正友标记法对双目摄像头进行标定_第14张图片
径向畸变

cameraParams.RadialDistortion

MATLAB张正友标记法对双目摄像头进行标定_第15张图片
切向畸变

cameraParams.TangentialDistortion

MATLAB张正友标记法对双目摄像头进行标定_第16张图片

第八步、重做以上步骤,测试右目相机的参数

右目相机的误差在1.3其实还行
!!!为什么我总是到不了1.0以下

MATLAB张正友标记法对双目摄像头进行标定_第17张图片
导出数据
MATLAB张正友标记法对双目摄像头进行标定_第18张图片
MATLAB张正友标记法对双目摄像头进行标定_第19张图片

第九步、完成!

以下就是这次标定的所有数据
下一章将使用双目摄像头测出的数据填入到代码中,再使用立体矫正以及立体匹配,这样就可以得到深度图,使用深度图再进行视差运算,得到视差图。测距测试!!

MATLAB张正友标记法对双目摄像头进行标定_第20张图片

可能遇到的问题

  • 点击计算按钮后出现这个对话框

MATLAB张正友标记法对双目摄像头进行标定_第21张图片
来我们翻译一下(百度翻译的,正所谓冤有头…)

Unable to estimate camera parameters. Images may contain severe lensdistortion or the 3-D onentations of the cabra tion pattem are toosimilar across images. If calibration pattem onentations are toosimilar, try removing very simar images or adding additional images withhe pattem in varied orientations

无法估计摄像机参数。图像中可能存在严重的透镜畸变,或者图像中的三维结构模式过于相似。如果校准模式的组成非常相似,尝试删除非常simar图像或添加其他图像与模式在不同的方向

  • 标定的误差值非常大 >3

MATLAB张正友标记法对双目摄像头进行标定_第22张图片

你可能感兴趣的:(视觉小白入门,python,人工智能,计算机视觉)