原本这个文章是打算转载别人的,在经历过各个教程都失败后(1.要不然是前后不对应,估计是随便复制一下,2.要么是讲解很不清楚,没有讲解怎么使用参数),决定自己写一下。记录一下,尽量会非常详细
0.前期准备
- 准备棋盘格
类似于这种:下载地址在这里:https://pan.baidu.com/s/1qYu0IkgbffuoCgANiQ5-Dw
必须实际打印出来哦,你用别人的标定图片怎么可能反映你自己的摄像头特征呢。 - 准备标定图片
利用opencv读取你自己的摄像头,按下s键进行截图,分别保存在left文件夹和right文件夹
有可能需要修改的地方: 1.folder 改为自己的路径 2.我这里的双目摄像头图像是在一个框里显示的,所以只需要capture一次,如果你的摄像头是分开的,则要两次capture 3.分辨率设置的时候,要根据自己的摄像机分辨率参数来设置,这很重要!!! |
import cv2
import time
AUTO = True # 自动拍照,或手动按s键拍照
INTERVAL = 2 # 自动拍照间隔
camera = cv2.VideoCapture(0)#也许你可能要capture两次
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 2560)#设置分辨率
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 960)#
utc = time.time()
folder = "E:/pythonlearning/opencv/screenshot/" # 拍照文件目录
def shot( frame):
global counter
leftpath = folder +"left/"+"left_" + str(counter) + ".jpg"
rightpath=folder + "right/"+ "right_" + str(counter) + ".jpg"
leftframe=frame[0:960,0:1280]#这里是为了将合在一个窗口显示的图像分为左右摄像头
rightframe=frame[0:960,1280:2560]
cv2.imwrite(leftpath, leftframe)
cv2.imwrite(rightpath, rightframe)
print("snapshot saved into: " + leftpath)
print("snapshot saved into: " + rightpath)
while True:
ret, frame = camera.read()
cv2.imshow("original", frame)
now = time.time()
key = cv2.waitKey(1)
if key == ord("q"):
break
elif key == ord("s"):
shot( frame)
counter += 1
camera.release()
cv2.destroyWindow("original")
这是我获得的标定图片
1.Matlab标定
matlab版本:R2015b
获取图片成功后,则要使用这些图片了
1.打开app->找到stereo calibration camera
2.选定三个复选框后,add images
切记此处的 25是系统默认的,实际的是根据自己打印出来的方格宽度决定的。
添加图片
下面将会使用这些参数
2.opencv配置参数
- 点进去stereoParams.CameraParameters1.IntrinsicMatrix
left_camera_matrix = np.array([[837.046533944197, 0., 0.],
[-1.38537933662732, 838.772077702795