首先编写图片采集程序,就是将摄像机采集到的图像保存成图片,程序如下,每点击一次’s’键记录一张照片:
# -*- coding: utf-8 -*-
# 用于获取单目摄像头的照片
import cv2
import time
AUTO = False # 自动拍照,或手动按s键拍照
INTERVAL = 2 # 自动拍照间隔
cv2.namedWindow("picture")
camera = cv2.VideoCapture(1)
# 设置分辨率 1280x960;
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 960)
counter = 0
utc = time.time()
folder = "./SaveImage/" # 拍照文件目录
def shot(pos, frame):
global counter
path = pos + "_" + str(counter) + ".png"
cv2.imwrite(path, frame)
print("snapshot saved into: " + path)
while True:
ret, frame = camera.read()
pic_frame = frame[0:960, 0:1280]
cv2.imshow("pic", pic_frame)
now = time.time()
if AUTO and now - utc >= INTERVAL:
shot("pic", pic_frame)
counter += 1
utc = now
key = cv2.waitKey(1)
if key == ord("q"):
break
elif key == ord("s"):
shot("pic", pic_frame)
counter += 1
camera.release()
cv2.destroyWindow("picture")
Matlab 工作空间中输入
>>open checkerboardPattern.pdf
打开棋盘表文件,这个文件是matlab官方给出的
打印出来,通过图像采集程序拍摄20张以上的图片。
然后在Matlab中再输入:
>>cameraCalibrator
打开校准工具箱
然后添加图片
然后输入每个格子的大小,单位可以随意选择,弹但要跟实际大小相对应,选择畸变程度,可以是Low或High:
然后设定参数:
可以按如下设置:
还可以选择图像的模式,但校准出来的结果是有区别的,默认选择标准即可:
然后点击校准,得到如下图:
如果有个别照片误差较大可删除后再次校准,如果感觉可以接受了可以输出参数,
有用的参数有三个cameraParams.IntrinsicMatrix,cameraParams.RadialDistortion,cameraParams.TangentialDistortion,其中cameraParams.IntrinsicMatrix需要转置之后才能使用,如
cameraParams.IntrinsicMatrix=
1377.89888495143 0 0
-0.0207543400232937 1392.57441631544 0
621.846147431590 443.218188879406 1
cameraParams.RadialDistortion=
-0.337031306642593 0.147784092519191
cameraParams.TangentialDistortion=
-0.000292356242716531 -0.000847460411873654
校准程序如下:
# -*- coding: utf-8 -*-
# 用于获取单目摄像头的照片
import cv2
import time
import numpy as np
camera = cv2.VideoCapture(1)
# 设置分辨率
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 960)
counter = 0
utc = time.time()
folder = "./SaveImage/" # 拍照文件目录
# cameraParams.IntrinsicMatrix的转置
cam_matrix = np.array([[1377.9, -0.0208, 621.8461],
[0, 1392.6, 443.2182],
[0, 0, 1]])
# cameraParams.RadialDistortion cameraParams.TangentialDistortion
cam_distortion = np.array([-0.337031306642593, 0.147784092519191, -0.00029235624271653, -0.000847460411873654, 0])
while True:
ret, frame = camera.read()
pic_frame = frame[0:960, 0:1280]
cv2.imshow("pic", pic_frame)
dst = cv2.undistort(pic_frame, cam_matrix, cam_distortion)
cv2.imshow("pic1", dst)
key = cv2.waitKey(1)
if key == ord("q"):
break
camera.release()
cv2.destroyWindow("pic")
cv2.destroyWindow("pic1")
校准结果如下,左侧门边框明显由曲线变为了直线,效果很好:
但是校准后的图像整体变成了一个枕头型: