利用MATLAB校准单目摄像头

       首先编写图片采集程序,就是将摄像机采集到的图像保存成图片,程序如下,每点击一次’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")

校准结果如下,左侧门边框明显由曲线变为了直线,效果很好:

 但是校准后的图像整体变成了一个枕头型:

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值