当前位置:网站首页>【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;
}
}
边栏推荐
猜你喜欢
随机推荐
信息化和数字化的本质区别是什么?
ALCCIKERS Shane 20191114
期货开户调整交易所保证金标准
C语言实验十 函数(二)
信息收集之cms指纹识别
go泛型使用方法
微信支付软件架构,这也太牛逼了!
交返是做日内交易的必要条件
期货开户交返是行内公开的秘密
Oracle data to mysql FlinkSQL CDC to achieve synchronization
Kubernetes — Calico
【刷题篇】打家劫舍
哈希表
GateWay实现负载均衡
浅谈国产ERP的“横纵竖”三向发展态势
Debian侵犯Rust商标,妥协改名还是会得到豁免?
dbeaver连接MySQL数据库及错误Connection refusedconnect处理
NFT到底有哪些实际用途?
字节给我狠狠上了一课:危机来的时候你连准备时间都没有...
fastjson详解