OpenCV实现相机校正的方法

  介绍

这篇文章主要介绍OpenCV实现相机校正的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

具体内容如下

1。相机标定

根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和畸变系数。

标定的流程是:

<李>

准备棋盘格数据,即用于标定的图片

<李>

对每一张图片提取角点信息

<李>

在棋盘上绘制提取到的角点(非必须,只是为了显示结果)

<李>

利用提取的角点对相机进行标定

<李>

获取相机的参数信息

2。关于相机校正用到的几个API:

<强> 1,寻找棋盘图中的棋盘角点

矩形,,corners =, cv2.findChessboardCorners (pattern_size,形象,还以为;旗帜)

<强>参数:

<李>

图片:输入的棋盘图,必须是8位的灰度或者彩色图像

<李>

pattern_size:棋盘图中每行每列的角点个数(内角点)。

<李>

标记:用来定义额外的滤波步骤以有助于寻找棋盘角点。所有的变量都可以单独或者以逻辑或的方式组合使用。取值主要有:

,,,,,, CV_CALIB_CB_ADAPTIVE_THRESH:使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。

,,,,,,,CV_CALIB_CB_NORMALIZE_IMAGE :在利用固定阈值或者自适应的阈值进行二值化之前,先使用cvNormalizeHist来均衡化图像亮度。

        CV_CALIB_CB_FILTER_QUADS :使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块。

返回:

  • Corners:检测到的角点

  • rect: 输出是否找到角点,找到角点返回1,否则返回0

2、检测完角点之后可以将测到的角点绘制在图像上,使用的API是:

cv2.drawChessboardCorners(img, pattern_size, corners, rect)

参数:

  • Img: 预绘制检测角点的图像

  • pattern_size : 预绘制的角点的形状

  • corners: 角点矩阵

  • rect: 表示是否所有的棋盘角点被找到,可以设置为findChessboardCorners的返回值

注意:如果发现了所有的角点,那么角点将用不同颜色绘制(每行使用单独的颜色绘制),并且把角点以一定顺序用线连接起来。

3利用定标的结果计算内外参数

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, image_size, None, None)

参数:

  • Object_points:世界坐标系中的点,在使用棋盘的场合,令z的坐标值为0,而x,y坐标用里面来度量,选用英寸单位,那么所有参数计算的结果也是用英寸表示。最简单的方式是定义棋盘的每一个方块为一个单位。

  • image_points:在图像中寻找到的角点的坐标,包含object_points所提供的所有点

  • image_size: 图像的大小,以像素为衡量单位

返回:

  • ret: 返回值

  • mtx: 相机的内参矩阵,大小为3*3的矩阵

  • dist: 畸变系数,为5*1大小的矢量

  • rvecs: 旋转变量

  • tvecs: 平移变量

2.1 图像去畸变

上一步中得到相机的内参及畸变系数,利用其进行图像的去畸变,最直接的方法就是调用opencv中的函数得到去畸变的图像:

def img_undistort(img, mtx, dist):
  ,,,dst =, cv2.undistort (img, mtx,经销,,没有,,mtx)
  ,,,return  dst 

求畸变的API:

dst =, cv2.undistort (img, mtx,经销,,没有,,mtx)

<强>参数:

<李>

img:要进行校正的图像

<李>

mtx:相机的内参

<李>

dist:相机的畸变系数

<强>返回:

<李>

dst:图像校正后的结果

3。相机校正

import  cv2   import  numpy  as  np   import  matplotlib.pyplot  as  plt   import  matplotlib.image  as  mpimg   import 水珠      def  plot_contrast_imgs (origin_img, converted_img,, origin_img_title=皁rigin_img",, converted_img_title=癱onverted_img",, converted_img_gray=False):   ,,,,,,   ,,,用于对比显示两幅图像   ,,,,,,   图,,,,(ax?, ax2),=, plt.subplots (1,, 2,, figsize=(15, 20))   ,,,ax1.set_title (origin_img_title)   ,,,ax1.imshow (origin_img)   ,,,ax2.set_title (converted_img_title)   ,,,if  converted_img_gray==True:   ,,,,,,,ax2.imshow (converted_img,提出=癵ray")   ,,,:   ,,,,,,,ax2.imshow (converted_img)   ,,,plt.show ()      #,1只参数设定:定义棋盘横向和纵向的角点个数并指定校正图像的位置   nx =9   ny =6   时间=file_paths  glob.glob (“。/camera_cal/校准* .jpg")   #,2只计算相机的内外参数及畸变系数   def  cal_calibrate_params (file_paths):   ,,,object_points =,[],, #,三维空间中的点:3 d   ,,,image_points =,[],,, #,图像空间中的点:2 d   ,,,#,2.1,生成真实的交点坐标:类似(0,0,0),(1,0,0),(2,0,0),....,(6 5 0)的三维点   ,,,objp =, np.zeros ((nx  *,纽约,,3),,np.float32)   ,,,objp [:,: 2],=, np.mgrid (0: nx, 0:纽约].T.reshape (1, 2)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

OpenCV实现相机校正的方法