首先是Segement的构造函数
Segment::Segment(const string &pascal_prototxt, const string &pascal_caffemodel, const string &pascal_png):mbFinishRequested(false),mSkipIndex(SKIP_NUMBER),mSegmentTime(0),imgIndex(0)
{
model_file = pascal_prototxt; // 模型文件,网络模型 ..../ORB_SLAM2_PointMap_SegNetM/prototxts/segnet_pascal.prototxt
trained_file = pascal_caffemodel; // 训练文件,训练好的参数 ..../ORB_SLAM2_PointMap_SegNetM/models/segnet_pascal.caffemodel
LUT_file = pascal_png; // 调色板 ..../ORB_SLAM2_PointMap_SegNetM/tools/pascal.png
label_colours = cv::imread(LUT_file,1); // 标签颜色
//cv::imread("label_colours",label_colours);
cv::cvtColor(label_colours, label_colours, CV_RGB2BGR); // 格式转换
mImgSegmentLatest=cv::Mat(Camera::height,Camera::width,CV_8UC1); // 语义掩膜(无颜色)
mbNewImgFlag=false;
}
设置Tracking线程的指针
void Segment::SetTracker(Tracking *pTracker)
{
mpTracker=pTracker;
}
查看是否有新的图像帧进入
bool Segment::isNewImgArrived()
{
unique_lock<mutex> lock(mMutexGetNewImg);
if(mbNewImgFlag)
{
mbNewImgFlag=false;
return true;
}
else
return false;
}
函数的源头是System.cc中的
mptSegment =new thread(&ORB_SLAM2::Segment::Run,mpSegment);
由此开启segment线程.
这个函数主要执行了
接下来我们来仔细分析一下这个函数:
classifier=new Classifier(model_file, trained_file); // 调用了caffe的接口
while(1)
{
usleep(1);
if(!isNewImgArrived()) // 是否是新的一帧图像
continue;
mImgSegment=classifier->Predict(mImg, label_colours);
cv::cvtColor(mImgSegment,mImgSegment_color, CV_GRAY2BGR);
LUT(mImgSegment_color, label_colours, mImgSegment_color_final); // mImgSegment图片是灰色的,没有颜色,经过调色版上色之后得到mImgSegment_color_final
cv::resize(mImgSegment, mImgSegment, cv::Size(Camera::width,Camera::height) );
cv::resize(mImgSegment_color_final, mImgSegment_color_final, cv::Size(Camera::width,Camera::height) );
mSegmentTime+=std::chrono::duration_cast<std::chrono::duration<double> >(t4 - t3).count();
mSkipIndex=0;
imgIndex++;
ProduceImgSegment();
if(CheckFinish()) // 停止的flag
{
break;
}
检查Segment是否完成
bool Segment::CheckFinish()
{
unique_lock<mutex> lock(mMutexFinish);
return mbFinishRequested;
}
外部请求停止
void Segment::RequestFinish()
{
unique_lock<mutex> lock(mMutexFinish);
mbFinishRequested=true;
}
保存了上一帧和本帧的分割图片mImgSegmentLatest,并且告诉Track新的分割图片已经就绪
void Segment::ProduceImgSegment()
{
std::unique_lock <std::mutex> lock(mMutexNewImgSegment);
mImgTemp=mImgSegmentLatest;
mImgSegmentLatest=mImgSegment;
mImgSegment=mImgTemp;
mpTracker->mbNewSegImgFlag=true;
}
cv::Mat mImg;
cv::Mat mImgTemp; // 存储最新一帧上一帧图像的临时变量
cv::Mat mImgSegment_color; // 三通道的但颜色依然是黑色的语义掩模
cv::Mat mImgSegment_color_final; // 彩色的语义掩模
cv::Mat mImgSegment; // 语义分割后的黑色掩模
cv::Mat mImgSegmentLatest; // 语义掩模(无颜色)
Tracking* mpTracker; // 跟踪线程的指针
以上就是DS-SLAM 的Segment.cc解析的全部内容,Thanks for reading!