Camera Calibration 相机标定

Camera Calibration 相机标定

一、相机标定方法

在opencv中提供了一组函数用于实现相机的标定,标定返回的值包括:相机内参矩阵(fx fy xc yc)、相机外参矩阵(R t)以及畸变矩阵。

标定的步骤如下:

  1. 准备棋盘格,棋盘格图片可以自行打印,以下使用107方格的棋盘格,交点则为96,棋盘格的大小1mm,即
    gridsize=1

  2. 拍照,拍照的原则是多角度,根据理论至少要两种角度的拍照,实际中通常会拍20张左右;

  3. 使用opencv提供的角点检测函数findChessboardCorners找到棋盘格中的角点,并将每幅图片的角点值存放到list中,同时将棋盘格的角点的三维坐标存放到另一个list。

  4. 使用calibrateCamera函数获取内存矩阵、畸变矩阵、旋转矩阵以及转移矩阵。

5.使用undistort函数将畸变的图像进行校正并查看校正后的图片效果。

  1. 代码如下(opencv_3.4.3):

#!/usr/bin/env
python3

-*- coding: utf-8

-*-

import numpy as np

import cv2

#图片角点个数

objp_dict
= {

1: (9, 5),

2: (9, 6),

3: (9, 6),

4: (9, 6),

5: (9, 6),

6: (9, 6),

7: (9, 6),

8: (9, 6),

9: (9, 6),

10: (9, 6),

11: (9, 6),

12: (9, 6),

13: (9, 6),

14: (9, 6),

15: (9, 6),

16: (9, 6),

18: (9, 6),

17: (9, 6),

19: (9, 6),

20: (9, 6),

}

objp_list
= []

corners_list
= []

for k in objp_dict:

nx, ny = objp_dict[k]



# Prepare object

points, like (0,0,0), (1,0,0), (2,0,0) …,(6,5,0) gridsize=1(mm)

objp = np.zeros((nx*ny,3), np.float32)

#生成角点的三维坐标

objp[:,:2] = np.mgrid[0:nx,

0:ny].T.reshape(-1,2)

# Make a list of

calibration images

fname = 'camera_cal/calibration%s.jpg' % str(k)

img = cv2.imread(fname)



# Convert to

grayscale

gray = cv2.cvtColor(img,

cv2.COLOR_BGR2GRAY)

# Find the

chessboard corners

ret, corners =

cv2.findChessboardCorners(gray, (nx, ny), None)

# If found, save

& draw corners

if ret == True:

    #

Save object points and corresponding corners

    objp_list.append(objp)

    corners_list.append(corners)

    #

Draw and display the corners

    #cv2.drawChessboardCorners(img,

(nx, ny), corners, ret)

    #plt.imshow(img)

    #plt.show()

    #print('Found

corners for %s’ % fname)

else:

    print('Warning:

ret = %s for %s’
% (ret, fname))

img
= cv2.imread(‘camera_cal/calibration1.jpg’)

img_size
= (img.shape[1], img.shape[0])

‘’’

mtx : 内参矩阵

dist: 畸变矩阵

rvecs : 旋转矩阵

tvecs : 转移矩阵

‘’’

ret,
mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objp_list, corners_list,
img_size,None,None)

#将原始图片转换成未发生畸变的图片

dst
= cv2.undistort(img, mtx, dist, None, mtx)

com_img
= np.hstack((img, dst))

cv2.namedWindow(‘image’,
cv2.WINDOW_NORMAL)

cv2.imshow(‘image’,
com_img)

cv2.waitKey(0)

cv2.destroyAllWindows()

二、 什么是相机标定(What is Camera Calibration?)

找到影响图像成像过程的内部相机参数:

图像中心(不是width/2,
height/2)

焦距长度

行像素和列像素的比例因子

在这里插入图片描述

扭曲factor
在这里插入图片描述

镜片扭曲

在这里插入图片描述

三、动机

Camera Calibration 用于

重构真实世界模型:Virtual L.A. project

与世界交互:e.g.机器人

Camera Calibration 相机标定_第1张图片

如上图所示,估计红色与蓝色两个点的几何投影

四、 图像的行列比例(Scaling of Rows and
Columns in Image)

相机像素不是完全符合正方形

相机输出可能模糊为近似值(NTSC)

图像可能从数据卡上获得 ·A/D转换器采样NTSC信号

相机->NTSC信号->转换为数字信号->显示器上显示

Camera Calibration 相机标定_第2张图片

五、 混合透镜成像(Compound Lens Imaging)

单透镜系统在其周围部分会造成图像扭曲(image distort)

混合透镜可以用于减少彩色效应和针垫效应

Camera Calibration 相机标定_第3张图片

普通摄像机的相机图像平面

Camera Calibration 相机标定_第4张图片

对同样的针孔摄像机(pinhole camera),相机图像平面(camera image plane)不同

六、相机标定目标

将所拍摄图像在三维坐标系中找到对应位置

Camera Calibration 相机标定_第5张图片

你可能感兴趣的:(摄像头,摄像头定位,摄像头标定)