opencv相机模型和标定

 

透镜畸变

径向畸变是由于透镜的形状造成的,而切向畸变则是整个相机的组装过程造成的

标定

用opencv来计算内参矩阵和畸变向量,通过cv::calibrateCamera()来完成

标定的方法时把相机对准一个具有很多独立可标识点的已知结构

旋转矩阵和平移向量

总的旋转矩阵R是Rx,Ry,Rz的乘积

平移向量T是以物体中心为原点的坐标系到以相机中心为原点的坐标系

每个视图需要求解10个参数:旋转和平移需要六个参数,相机内参需要四个参数

相机内参在不同视图保持不变

至少需要两个视图求解所有的几何参数

标定板

棋盘,圆网络,ArUco或者ChArUco图案

用cv::findChessboardCorners()找到棋盘角点

cv::cornerSubPix()获得更精确的结果

使用cv::drawChessboardCorners()绘制棋盘角点

圆网络和cv::findCirclesGrid()

单应性

计算机视觉中将平面的单应性定义为从一个平面到另一个平面的投影映射

一个已知平面物体给出8个方程:四个x,y

每个视图引入六个新未知数

所以给出足够多视图,就可以计算任意数量的相机内参

cv::findHomography() 求解H

相机标定

为相机内在参数和畸变参数进行相机标定

棋盘角点个数和参数个数

四个相机内在参数和五个(或更多)畸变参数—由三个(or more)径向参数和两个切向参数组成

K个棋盘图像提供2·N·K个约束,忽略畸变参数,有4个内在参数和6·K个外参数

求解的前提是2·N·K≥6·K+4

但是实际上每个视图只能得到4个有用的角点信息

标定函数

一旦有个几个图像的角点,,就可以调用cv::calibrateCamera()

得到的结果是相机内参矩阵,畸变系数,旋转向量和平移向量

仅使用cv::solvePnP()计算外参数

只用cv::solvePnPRansac()计算外参数

矫正

标定相机需要做两件事:第一纠正畸变的影响,第二根据获得的图像重构三维场景

矫正映射

指定输入图像中每个像素在输出图像中移动到的位置

使用cv::convertMaps()在不同表示方式之间转换矫正映射

使用cv::initUndistortRectifyMap()计算矫正映射

使用cv::remap()矫正图像

使用cv::undistort()进行单个图像矫正

使用cv::undistortPoints()进行稀疏矫正

只从图像中收集一组点,只计算特定的一系列点的正确位置

与标定结合

获取图像,从图像中提取标定数据,从数据中计算相机的内在参数,并使用相机信息矫正输入视频