一。标定的目的:
1.畸变矫正。
因为相机成像大都依赖于感光芯片和透镜,现实的感光芯片和透镜,以及其安装并不可能达到理论的完美情况,因此需要矫正由此成像造成影响。
畸变可分为以下几种因素:
①光轴中心与芯片中心不重合(感光芯片安装引起)。
需要求解光轴中心与感光芯片中心的位置偏移量 cx,cy;
②x向和y向 成像投影距离不对等(感光芯片和透镜安装共同引起)。
需要求解各自的投影距离fx,fy;
③径向畸变(透镜质量引起)。
通过泰勒级数展开式模拟矫正结果,需要求解展开式的各项系数k1,k2,k3...kn;
④切向畸变(感光芯片和透镜安装共同引起)。
需要求解切向畸变量参数 p1,p2;
2.求解像素当量,即像素量和物理世界的长度关系,如 每像素代表多少毫米。(有更简便的方法,以后会更新做法)
3.求解相机相对姿态。即了解当前相机对于某个特定物体的特定姿态。
二。如何标定
所有方法标定都大概可以分为以下几个步骤。
1.获取多组图像与物理世界的对应点。
2.求解标定参数。
3.通过标定参数对图像进行矫正
Talk is cheap,show you the code,
以下是Opencv棋盘方式标定的代码示例。
#pragma once
#include<opencv.hpp>
/*创建棋盘图片
Cols_n 图片列数
Rows_n 图片行数
WidthOfROI 棋盘宽度(像素)
pMat 输出图片
*/
void f_get_ChessBoard(int Cols_n, int Rows_n, int WidthOfROI, cv::Mat* pMat)
{
(*pMat) = cv::Mat(WidthOfROI*Rows_n, WidthOfROI*Cols_n, CV_8UC1, cv::Scalar(0));
for (int i = 0; i < Cols_n; ++i)
{
for (int j = 0; j < Rows_n; ++j)
{
if ((i + j) % 2 == 1)
{
for (int x = 0; x < WidthOfROI; x++)
{
for (int y = 0; y <