地表三维模型的构建与时序模型地表形变监测(五):相机标定试验与研究

发布于 2020-09-11  614 次阅读


一·相机标定原理

相机都具有内外参数,内参数一般出厂就已经标定。

通过相机参数,我们可以在进行后续图像的纠正。

二·相机参数估计与标定法

2.1 参数标定板

对于相机参数的确定,需要标定板进行辅助,标定板一般在实验室里面有专用于摄影测量设备校正的标准板,我们也可以自己生成一张类似的棋盘图,在精度要求不是很高的情况下,已经够用。

下面是生成棋盘图的相关代码,相关参数已标注清楚,尺寸可以根据自己的需求定制:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
comment: 生成棋盘标定图

@author: GanAH  2020/9/11.
@version 1.0.
"""
import cv2
import numpy as np

def generatePattern(CheckerboardCellSize, column_count, row_count):
    '''
    自定义生成棋盘
    :param CheckerboardCellSize: 棋盘格子大小,单位:px
    :param column_count: 棋盘格横向黑白格子数
    :param row_count: 棋盘格纵向黑白格子数
    :return:
    '''
    column_count = column_count -1
    row_count = row_count -1

    black = np.zeros((CheckerboardCellSize, CheckerboardCellSize, 3), np.uint8)
    white = np.zeros((CheckerboardCellSize, CheckerboardCellSize, 3), np.uint8)
    black[:] = [0, 0, 0]  # 纯黑色
    white[:] = [255, 255, 255]  # 纯白色

    black_white = np.concatenate([black, white], axis=1)
    black_white2 = black_white
    white_black = np.concatenate([white, black], axis=1)
    white_black2 = white_black

    # 横向连接
    if column_count % 2 == 1:
        for i in range(1, (column_count + 1) // 2):
            black_white2 = np.concatenate([black_white2, black_white], axis=1)
            white_black2 = np.concatenate([white_black2, white_black], axis=1)
    else:
        for i in range(1, column_count // 2):
            black_white2 = np.concatenate([black_white2, black_white], axis=1)
            white_black2 = np.concatenate([white_black2, white_black], axis=1)
        black_white2 = np.concatenate([black_white2, black], axis=1)
        white_black2 = np.concatenate([white_black2, white], axis=1)

    jj = 0
    black_white3 = black_white2
    for i in range(0, row_count):
        jj += 1
        # 纵向连接
        if jj % 2 == 1:
            black_white3 = np.concatenate((black_white3, white_black2))  # =np.vstack((img1, img2))
        else:
            black_white3 = np.concatenate((black_white3, black_white2))  # =np.vstack((img1, img2))

    cv2.imshow('', black_white3)
    cv2.imwrite('pattern.jpg', black_white3)
    cv2.waitKey(10000)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    generatePattern(100, 20, 16)

设置参数后运行即可获取生成的结果。

生成的实例标定板

2.2 相机参数估计

2.2.1 获取相机拍摄影像

将棋盘图打印处理后,将相应尺寸测量并留存。

在光照均匀的条件下,在不同的角度,使用待检测相机拍摄标定板,将结果影像处理即可得到相机参数。

2.2.2 相机参数解算与精度评估

三·相机标定结果

四·总结

五·参考文献