当前位置:网站首页>【ORB_SLAM2】void Frame::ComputeImageBounds(const cv::Mat &imLeft)
【ORB_SLAM2】void Frame::ComputeImageBounds(const cv::Mat &imLeft)
2022-08-02 01:05:00 【小秋SLAM实战教程】
ComputeImageBounds这个函数的主要目的是获得去畸变后的图像坐标的范围,为后续的网格划分提供边界值,这个函数只会在第一帧图像进来或者内参发生了改变的时候被调用,这里的边界值选取使用了最大覆盖的准则,也就是左上角取小,右下角取大,从而能够覆盖整个去畸变后的图像
void Frame::ComputeImageBounds(const cv::Mat &imLeft)
{
// 如果畸变参数不为0,用OpenCV函数进行畸变矫正
if(mDistCoef.at<float>(0)!=0.0)
{
// 保存矫正前的图像四个边界点坐标: (0,0) (cols,0) (0,rows) (cols,rows)
cv::Mat mat(4,2,CV_32F);
mat.at<float>(0,0)=0.0; //左上
mat.at<float>(0,1)=0.0;
mat.at<float>(1,0)=imLeft.cols; //右上
mat.at<float>(1,1)=0.0;
mat.at<float>(2,0)=0.0; //左下
mat.at<float>(2,1)=imLeft.rows;
mat.at<float>(3,0)=imLeft.cols; //右下
mat.at<float>(3,1)=imLeft.rows;
// Undistort corners
// 和前面校正特征点一样的操作,将这几个边界点作为输入进行校正
mat=mat.reshape(2);
cv::undistortPoints(mat,mat,mK,mDistCoef,cv::Mat(),mK);
mat=mat.reshape(1);
//校正后的四个边界点已经不能够围成一个严格的矩形,因此在这个四边形的外侧加边框作为坐标的边界
mnMinX = min(mat.at<float>(0,0),mat.at<float>(2,0));//左上和左下横坐标最小的
mnMaxX = max(mat.at<float>(1,0),mat.at<float>(3,0));//右上和右下横坐标最大的
mnMinY = min(mat.at<float>(0,1),mat.at<float>(1,1));//左上和右上纵坐标最小的
mnMaxY = max(mat.at<float>(2,1),mat.at<float>(3,1));//左下和右下纵坐标最小的
}
else
{
// 如果畸变参数为0,就直接获得图像边界
mnMinX = 0.0f;
mnMaxX = imLeft.cols;
mnMinY = 0.0f;
mnMaxY = imLeft.rows;
}
}
边栏推荐
猜你喜欢
随机推荐
Navicat数据显示不完全的解决方法
from origin ‘null‘ has been blocked by CORS policy Cross origin requests are only supported for
C语言实验八 字符数组程序设计
信息收集之cms指纹识别
Redis cluster mode
Mapped Statements collection does not contain value for的解决方法
Can‘t connect to MySQL server on ‘localhost3306‘ (10061) 简洁明了的解决方法
DOA从一维阵列传感说起
feign异常传递的两种方式 fallbackfactory和全局处理 获取服务端自定义异常
mapbox使用教程
23.卷积神经网络实战-ResNet
go笔记——map
R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型、使用anova函数进行方差分析通过p值确认指定连续变量和风险值HR之间是否存在非线性关系
内部类、异常简单介绍(第十天)
flex布局中使用flex-wrap实现换行
Detailed explanation of fastjson
GateWay实现负载均衡
C语言函数详解(1)【库函数与自定义函数】
接口(第九天)
C语言实验七 二维数组程序设计