VSLAM实践(一):基于python+opencv的后置相机拍照模式内参标定

VSLAM实践(一):基于python+opencv的后置相机拍照模式内参标定

本文采用棋盘标定板标定法,实现对后置相机拍照模式内参的标定,棋盘单个黑框的边长为2cm,一共通过不同角度拍摄了10张照片;
在这里插入图片描述代码:

# -*- coding:utf-8 -*-

import cv2
import numpy as np
import glob

# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)

# 获取标定板角点的位置
objp = np.zeros((8 * 6, 3), np.float32)
objp[:, :2] = np.mgrid[0:16:8j, 0:12:6j].T.reshape(-1, 2)  # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y
obj_points = []  # 存储3D点
img_points = []  # 存储2D点
images = glob.glob("*.jpg")
for fname in images:

    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    size = gray.shape[::-1]
    ret, corners = cv2.findChessboardCorners(gray, (8, 6), None)
    print(size)
    if ret:
        obj_points.append(objp)


        corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria)  # 在原角点的基础上寻找亚像素角点

        if corners2.any:
            img_points.append(corners2)
        else:
            img_points.append(corners)

        cv2.drawChessboardCorners(img, (8, 6), corners, ret)  # 记住,OpenCV的绘制函数一般无返回值
        cv2.namedWindow('img', 30)
        cv2.imshow('img', img)

        cv2.waitKey()

print(len(img_points))
cv2.destroyAllWindows()

# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)

print("ret:", ret)
print("mtx:\n", mtx ) # 内参数矩阵
print("dist:\n", dist)  # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs:\n", rvecs)  # 旋转向量  # 外参数
print("tvecs:\n", tvecs)  # 平移向量  # 外参数
print("-------------------计算反向投影误差-----------------------")
tot_error = 0
for i in range(len(obj_points)):
    img_points2, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], mtx, dist)
    error = cv2.norm(img_points[i], img_points2, cv2.NORM_L2) / len(img_points2) #像素坐标的方差
    tot_error += error

mean_error = tot_error / len(obj_points)
print("total error: ", tot_error)  #13.38
print("mean error: ", mean_error)  #1.34
#鉴于Iphone6s相机分辨率为3024*4032,1.34的平均重投影像素误差自己感觉基本可以接受

最终相机内参结果为:
在这里插入图片描述后续VSLAM将会以此内参作为标准输入,来进行相机位姿及地图坐标的求解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值