前言
该部分函数在Tracking.cc源文件中定义,用于处理图像。
1.函数作用:
1.GrabImageStereo 函数的主要作用是处理输入的双目图像(左视图和右视图),进行必要的预处理(颜色转换),创建表示当前帧的对象,并执行跟踪操作,最后返回当前帧在世界坐标系下的变换矩阵。
cv::Mat Tracking::GrabImageStereo(const cv::Mat &imRectLeft, const cv::Mat &imRectRight, const double ×tamp)
{
....
}
2.GrabImageRGBD函数的主要作用是处理输入的 RGB-D 图像,进行必要的预处理(颜色转换、深度格式转换),创建表示当前帧的对象,并执行跟踪操作,最后返回当前帧在世界坐标系下的变换矩阵。
cv::Mat Tracking::GrabImageRGBD(const cv::Mat &imRGB,const cv::Mat &imD, const double ×tamp)
{
....
}
3. GrabImageMonocular 函数的主要作用是处理输入的单目图像,进行必要的预处理(颜色转换),根据系统状态创建表示当前帧的对象,并执行跟踪操作,最后返回当前帧在世界坐标系下的变换矩阵。
cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im, const double ×tamp)
{
....
}
2.具体代码(以RGBD的为例)
cv::Mat Tracking::GrabImageRGBD(const cv::Mat &imRGB,const cv::Mat &imD, const double ×tamp)
{
// 将传入的参数赋值给该函数的内部变量,用于进行数据处理。
mImGray = imRGB;// 将输入的RGB图像赋值给mImGray(类成员变量CV:Mat)。
cv::Mat imDepth = imD;// 将输入的深度图像复制到imDepth。
//根据输入图像的通道数,确定其是RGB(3 通道)还是RGBA(4 通道)。
if(mImGray.channels()==3)
{
// 如果是RGB,则RGB转灰度,如果是BGR,则BGR转灰度。
if(mbRGB)// 头文件中定义的布尔变量mbRGB。如果 mbRGB为true,则说明图像是以RGB格式存储。
cvtColor(mImGray,mImGray,CV_RGB2GRAY);//将原来的RGB图像转换成灰度图在存放到原变量中。
// cvtColor 是 OpenCV 库中的一个函数,用于在不同的颜色空间之间转换图像。
// CV_RGB2GRAY 是 OpenCV 定义的常量,表示 RGB 到灰度的转换方式。
else
cvtColor(mImGray,mImGray,CV_BGR2GRAY);
}
// 同理如上。
else if(mImGray.channels()==4)
{
if(mbRGB)
cvtColor(mImGray,mImGray,CV_RGBA2GRAY);
else
cvtColor(mImGray,mImGray,CV_BGRA2GRAY);
}
// 检查绝对值是否大于某个特定值或者检查imDepth的数据类型是否为 CV_32F
if((fabs(mDepthMapFactor-1.0f)>1e-5) || imDepth.type()!=CV_32F)//浮点数类型成员函数mDepthMapFactor。
// fabs()函数用于计算浮点数的绝对值。
// 如果条件不成立则需要将深度图像imDepth转换为 32 位浮点格式
imDepth.convertTo(imDepth,CV_32F,mDepthMapFactor);
// 计算当前帧。
mCurrentFrame = Frame(mImGray,imDepth,timestamp,mpORBextractorLeft,mpORBVocabulary,mK,mDistCoef,mbf,mThDepth);
Track();
// 返回mCurrentFrame中的mTcw(当前帧相对于世界坐标系的变换矩阵),并使用clone()方法返回其副本,确保外部调用者不直接修改mTcw。
return mCurrentFrame.mTcw.clone();
}