相机标定(二)

写在前面

这篇主要是对前一篇文章的解读,以及相关的参考文件。和需要知道的东西

单目相机标定参考链接
http://blog.csdn.net/heroacool/article/details/51023921
主要参考一下链接。
https://blog.csdn.net/fengye2two/article/details/80686409?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control

SingleCameraCalibrator 项目 此项目用于对 相机进行标定,写入模型
定义错误结构体
ERR{
index 序号
Derr 错误率
Pt_Img 二维点float类型
Pt_PW 三维点float 类型
初始化函数
重载操作符< ;升序排列
}
模型文件结构体
{
设备编号 id
double pdCamera[9];//相机内参
double pdCoefficients[5];//摄像机的5个畸变系数:k1,k2,p1,p2,k3仅支持径向,切向
double pdRmat[9];//标定光平面旋转矩阵参数
double pdTmat[3];//标定光平面平移矩阵参数
}

主函数:
输入参数
参数文件,初始化文件,数据列表文件,写入的模型文件,x偏移量,y偏移量
SingleCameraCalibration(IntrinsicsFile, iniFile, dataListFile, modelFile, dx_offset, dy_offset);
从参数文件读取 内参矩阵, 模型
ReadCameraParameters(IntrinsicsFile, cameraM, distCoefficients, model);
内外参矩阵cameraMatrix 33,CV_64FC1 ,64位浮点数,通道为1
畸变系数distCoefficients 1
5 CV_64FC1 ,64位浮点数,通道为1,k1 k2 p1 p2 k3
将下面的值读取到model结构体中
内外参矩阵
1.675675467281303e+03 0 1.283523418943789e+03 0 1.684175875308985e+03 1.005861159085279e+03 0 0 1
畸变系数
-0.084261396889388 0.094000220253870 0.002534040690027 -0.004307360185249 0.029818290884515
再次将 内外参,畸变系数读取到cameraM, distCoefficients,中
从初始化文件中读取配置,读取配置的id 与ROI矩形区域,(x,y,长,宽)
ReadFile_ini(iniFile, ID, roi_rect);
将ID赋给上述的modle变量。
读取标定图像数据文件
Read_datalist(dataListFile, roi_rect, dx_offset, dy_offset, vecImgTotal, vecPwTotal);
读取图像的坐标 图像的x 等于读入的点加上ROI的x点,图像的y等于读入点的y加上ROI的y值。补偿偏移量。
读取对应的世界坐标,世界坐标的x 等于读入的值加上偏移量offsetx,世界坐标的y等于读入的值加上偏移量offsety, 此处设定z轴为0;
开始标定:
由相机内参获取某一平面的旋转向量,平移向量
Mat rvec, tvec;
这个函数需要查一下
bool b = solvePnPRansac(vecPw, vecImg, cameraM, distCoefficients, rvec, tvec);
由旋转向量获取旋转矩阵(旋转矩阵是3*3的,是世界坐标与相机坐标的变换)
参考:https://blog.csdn.net/fengye2two/article/details/80686409?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control

Mat rotation_Matrix = cv::Mat(3, 3, CV_32FC1, cv::Scalar::all(0));//旋转矩阵
Rodrigues(rvec, rotation_Matrix);
打印旋转矩阵与平移矩阵,并将矩阵写入上述的结构体model中
验证标定结果

在这里插入图片描述

在这里插入图片描述

将旋转矩阵 和平移矩阵组合,上述读取坐标时,将世界坐标的Z轴设为0;

所以此处 重新构建一个矩阵M, M包含旋转矩阵前两列,和平移矩阵

将 内参矩阵 与 旋转矩阵相乘,即为上图的m1*m2, 再求逆矩阵作为invH。
在这里插入图片描述

畸变校正
这个函数需要查一下
undistortPoints(vecImg, vecDst, cameraM, distCoefficients, noArray(), cameraM);//校正后点为同为像素坐标,校正后的坐标放在vecDst,
将矫正后的点取出,放在 新矩阵p(3*3)中,前两个值为x.y ,第三个值为补入的1,相当于上图最左侧的 {u,v,1}

计算世界坐标系 即是 invH *P
统计错误率 差的平方和 与 平均误差。是否需要再次标定。

在这里插入图片描述

这里没懂。 齐次坐标还原

CameraCalibrator2项目 此项目主要是进行测试

模型文件结构体 st_model
{
设备编号 id
double pdCamera[9];//相机内参
double pdCoefficients[5];//摄像机的5个畸变系数:k1,k2,p1,p2,k3仅支持径向,切向
double pdRmat[9];//标定光平面旋转矩阵参数
double pdTmat[3];//标定光平面平移矩阵参数
}

模型文件结构体Mat类型 st_Value_Info
{
​ Mat mat_Carmera; 内参矩阵
​ Mat mat_Coefficients; 畸变系数
​ Mat mat_InvH; 逆矩阵 即图像坐标与世界坐标的系数矩阵 m1m2的逆矩阵
​ Mat mat_Img; 图像
​ Point2f
pvecP;
​ int nLen
}

主函数
读取模型, 模型路径,模型内参矩阵,模型系数的逆矩阵
ReadModel(ModelPath, m_Info.mat_Carmera, m_Info.mat_Coefficients, m_Info.mat_InvH);

得到世界坐标系
GetLaserWorldPoint(Mat Img, st_Value_Info m_Info, int offsetX, int offsetY)
首先阈值化, 在进行33的腐蚀操作。在进行55的膨胀操作。
再求出每列的灰度重心,
此处参考:大意就是 越亮的位置,权重越大,越靠近重心。
https://blog.csdn.net/u010518385/article/details/101015604
https://blog.csdn.net/lyc_daniel/article/details/7869338?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-7.control
求完之后,在将偏移量进行补偿。
张正友相机标定代码 参考:
https://blog.csdn.net/dcrmg/article/details/52939318#


版权声明:本文为qq_28691955原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>