【理论+程序】利用张正友标定法,使用Opencv-Python3进行摄像机标定

本文介绍了一个基于OpenCV的相机标定程序,详细解释了如何通过棋盘格图像获取相机内参、畸变系数、旋转矩阵和平移矢量,并展示了畸变校正的两种方法:cv.undistort()和remapping。

要注意在输入棋盘格规格的时候,输入的是宽和高方向的角点个数,而不是棋盘格的数量。

可直接运行的代码:

"""
根据OpenCV-Python Tutorial修改的相机标定程序
OpenCV-Python Tutorial Camera Calibration link:
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html#calibration
中文教程链接:
http://woshicver.com/Eighth/7_1_%E7%9B%B8%E6%9C%BA%E6%A0%A1%E5%87%86/
"""

import numpy as np
import cv2
import glob

# 棋盘规格:宽高方向角点个数
w_corner = 11
h_corner = 11

# 角点精准化迭代过程的终止条件
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# 世界坐标,如 (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((w_corner*h_corner,3), np.float32)
objp[:,:2] = np.mgrid[0:w_corner,0:h_corner].T.reshape(-1,2)

# 用于存储所有图像的世界坐标点和图像坐标点
objpoints = []  # 3d point in real world space
imgpoints = []  # 2d points in image plane.

images = glob.glob('data/images/*.jpg')

for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 寻找棋盘角点
    ret, corners = cv2.findChessboardCorners(gray, (11,11),None)

    # 如果找到,则添加世界坐标点、细化后的图像坐标点
    if ret == True:
        objpoints.append(objp)
        # 亚像素级角点检测(细化)
        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        imgpoints.append(corners2)

        # 进行可视化,绘制并显示角点
        img = cv2.drawChessboardCorners(img, (w_corner,h_corner), corners2,ret)
        # 将图像缩小1/4,以便于显示
        img = cv2.resize(img, None, fx=0.25, fy=0.25, interpolation=cv2.INTER_CUBIC)
        cv2.imshow('img',img)
        cv2.waitKey(500)
cv2.destroyAllWindows()

'''
经过上面的步骤得到了目标点和图像点,下面进行校准。
使用函数 cv.calibrateCamera() 返回相机内参矩阵,畸变系数,旋转矩阵和平移矢量等
其中,mtx:相机内参;dist:畸变系数;revcs:旋转矩阵;tvecs:平移矢量。
'''
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
print
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值