『计算机视觉』python + opencv 相机畸变矫正

一、相机畸变

畸变: 指在世界坐标系中的直线转换到其他坐标系不再是直线,从而导致失真。

1. 径向畸变:(枕形、桶形)相机的光学镜头厚度不均匀,光线在远离透镜中心的地方比靠近中心的地方更加弯曲。

2. 切向畸变: 透镜不完全平行于图像平面,即 sensor 装配时与镜头间的角度不准。

径向畸变矫正: 以图像中心点为圆心,相同半径的点补充量相同,不同半径的点补偿量服从二次函数。
『计算机视觉』python + opencv 相机畸变矫正_第1张图片

二、相机成像过程

  1. 世界坐标系 —> 相机坐标系
    点的转换:求解外参 [ 旋转、平移 ]

  2. 相机坐标系 —> 图像物理坐标系
    投影到成像平面:求解内参 [ 相机矩阵、畸变系数 ]

  3. 图像物理坐标系 —> 图像像素坐标系
    将平面上的数据转换到图像平面:求解像素转换矩阵

相机内参:

  1. 相机矩阵:焦距、光学中心
  2. 畸变系数:畸变模型的 5 个参数 D = { k 1 k_1 k1, k 2 k_2 k2, k 3 k_3 k3, p 1 p_1 p1, p 2 p_2 p2}

相机外参:

通过旋转和平移将实际场景 3D 映射到相机的 2D 坐标过程中的旋转和平移就是外参;
描述的是 世界坐标 转换到 相机坐标 的过程。

三、相机标定

1. 相机标定的目的

获得相机的内参和外参矩阵(同时也会得到每一幅标定图像的旋转和平移矩阵),内参和外参系数可以对之后相机拍摄的图像进行矫正,得到畸变很小的图像。

2. 相机标定的输入

标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(默认 Z = 0 Z=0 Z=0 平面上)

3. 相机标定的输出

内参矩阵、外参矩阵、畸变系数

四、棋盘格标定实验

1. 实验步骤

(1) 打印一张棋盘格 A4 纸(黑白间距已知),并贴在一个平板上;
(2) 针对棋盘格拍摄若干张图片(10 ~ 20张);
(3) 在图片中检测角点;
(4) 根据角点位置信息和图像中的坐标,求解内参矩阵;
(5) 利用解析解估计方法计算出 5 个内参,以及 6 个外参;
(6) 根据极大似然估计策略,设计优化目标并实现参数的 refinement。

2. 数据集采集

  • 打印棋盘格并贴在一个平板上,针对棋盘格拍摄若干张图片。
  • 棋盘格的规格为 9(行) * 7(列),每一方格大小为 28mm。
    『计算机视觉』python + opencv 相机畸变矫正_第2张图片

3. 实验代码

思路:

  1. 完成标定板图像的采集(至少3张)
  2. 利用 findChessboardCorners() 函数检测标定板角点,并利用 cornerSubPix() 函数完成亚像素级校准
  3. 利用 calibrateCamera() 函数进行相机标定,得到内参矩阵和畸变系数
# coding=utf-8
import os
import numpy as np
import cv2
import glob
import re
# Contact with me

4. 实验结果

『计算机视觉』python + opencv 相机畸变矫正_第3张图片
内部参数计算结果:
『计算机视觉』python + opencv 相机畸变矫正_第4张图片
外部参数计算结果:
『计算机视觉』python + opencv 相机畸变矫正_第5张图片
『计算机视觉』python + opencv 相机畸变矫正_第6张图片

五、实验小结

注意点: 实验时需要关注自己打印出来的棋盘格行列数以及每个小方格的边长,代码中与之相关的参数要注意保持一致。

参考链接

  1. https://www.codenong.com/cs105362491/
  2. https://www.cnblogs.com/wildbloom/p/8320351.html
  3. https://zhuanlan.zhihu.com/p/94244568

你可能感兴趣的:(#,计算机视觉功能实现)