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

边栏推荐
猜你喜欢
随机推荐
关于MySQL的数据插入(高级用法)
datagrip 报错 “The specified database userpassword combination is rejected...”的解决方法
Kubernetes — 核心资源对象 — 存储
Reflex WMS中阶系列6:对一个装货重复run pick会有什么后果?
datagrip连接mysql数据库
NFT到底有哪些实际用途?
抖音数据接口API-获取用户主页信息-监控直播开启
第 45 届ICPC亚洲区域赛(上海)G-Fibonacci
青蛙跳台阶
IDEA版Postman插件Restful Fast Request,细节到位,功能好用
html+css+php+mysql实现注册+登录+修改密码(附完整代码)
iframe使用
Kubernetes — Flannel
三本毕业的我被腾讯拒绝了十四次,最终成功入职阿里
GateWay实现负载均衡
有效进行自动化测试,这几个软件测试工具一定要收藏好!!!
Use flex-wrap to wrap lines in flex layout
Test Cases: Four-Step Test Design Approach
ECMAScript 2022 正式发布,有你了解过的吗?
管理基础知识19









