当前位置:网站首页>【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;
}
}

边栏推荐
猜你喜欢
随机推荐
青蛙跳台阶
安全(2)
C语言实验六 一维数组程序设计
DCM 中间件家族迎来新成员
技术分享 | 接口测试中如何使用Json 来进行数据交互 ?
管理基础知识17
from origin ‘null‘ has been blocked by CORS policy Cross origin requests are only supported for
datagrip连接mysql数据库
Mapped Statements collection does not contain value for的解决方法
关于MySQL的数据插入(高级用法)
datax与datax-web安装部署
H5页面打开微信小程序
fastjson详解
go笔记之——goroutine
ERROR 1819 (HY000) Your password does not satisfy the current policy requirements
Why is on-chain governance so important, and how will Polkadot Gov 2.0 lead the development of on-chain governance?
接口(第九天)
Flink_CDC搭建及简单使用
C语言实现扫雷游戏
feign异常传递的两种方式 fallbackfactory和全局处理 获取服务端自定义异常









