本文主要是介绍MATLAB张正友标记法对双目摄像头进行标定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第一步、安装MATLAB
我这里使用的版本是MATLAB R2016a
具体软件自己去度娘找哈
破解就花费了我大半天
第二步、去打印标定要用到的棋盘
这里可以给你(有点小水印无伤大雅)
用A4纸打印出来
第四步、主角—双目摄像头
奉劝大家不要贪小便宜哈,得买个一百来块的,要不然数据极度不准确,而且还难用
我买了这个,150
第五步、测试双目摄像头
打开你们可爱的pycharm
安装opencv
写入代码
import cv2video = 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 cv2video = 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) & 0xFFif k == ord('a'):cv2.imwrite("left"+str(index)+".jpg", left_img)print("success index="+str(index))index=index+1if k == ord('s'):cv2.imwrite("right"+str(index2)+".jpg", right_img)print("success index2="+str(index2))index2=index2+1
以上代码实现了
按下a键就左目拍照
按下s键就右目拍照
左右目各拍20张标定图
第七步、使用MATLAB中的标定工具
一次性导入20张左目的照片
这里填棋盘的宽度,我是A4纸打印的是24mm(尺子量的)
具体需要你们去亲自量一下啦
等待MATLAB计算好就行啦
标点计算完了就会告诉你有多少个是可以用的,有多少个是无效的图像
第七步、计算相机数据值
点击Calibrate按钮就可以开始计算啦
计算完毕就会看到你的相机的位置
上面的柱形图就是每个图片的误差
!!!!!
我的有效图像居然只有七张!!!而且误差均值居然到了1.15!!!
重做ing!!!!
重做ing!!!!
重做ing!!!!
重做ing!!!!
重做ing!!!!
后来才发现1.15真的不高,在做了N次后发现1.15居然是最低的!!!
有些网站说误差需要小于0.5才可以通过,我有时候的误差可以到6!!经常性会到2点几
最后这次我做了有一点几,就果断导出数据了
按这个按钮导出到控制台
然后就可以看到左目相机的数据
接下来要看相机的内参矩阵,径向畸变和切向畸变。
内参矩阵
cameraParams.IntrinsicMatrix
径向畸变
cameraParams.RadialDistortion
切向畸变
cameraParams.TangentialDistortion
第八步、重做以上步骤,测试右目相机的参数
右目相机的误差在1.3其实还行
!!!为什么我总是到不了1.0以下
导出数据
第九步、完成!
以下就是这次标定的所有数据
下一章将使用双目摄像头测出的数据填入到代码中,再使用立体矫正以及立体匹配,这样就可以得到深度图,使用深度图再进行视差运算,得到视差图。测距测试!!
可能遇到的问题
- 点击计算按钮后出现这个对话框
来我们翻译一下(百度翻译的,正所谓冤有头…)
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张正友标记法对双目摄像头进行标定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!