日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

(一次性搞定)ORB_SLAM2地图保存与加载

發布時間:2023/11/27 生活经验 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (一次性搞定)ORB_SLAM2地图保存与加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(一次性搞定)ORB_SLAM2地圖保存與加載

本文記錄了ORB_SLAM2中地圖保存與加載的過程。
參考博客:
https://blog.csdn.net/qq_34254510/article/details/79969046
http://www.cnblogs.com/mafuqiang/p/6972841.html
https://blog.csdn.net/felaim/article/details/79667635

1、地圖保存

地圖保存過程比較簡單,只需要按照參考一步步修改源碼即可。接下來我們一起來走一遍這個過程。

1.1 地圖元素分析

所謂地圖保存,就是保存地圖“Map”中的各個元素,以及它們之間的關系,凡是跟蹤過程中需要用到的東西自然也就是需要保存的對象。地圖主要包含關鍵幀、3D地圖點、BoW向量、共視圖、生長樹等,在跟蹤過程中有三種跟蹤模型和局部地圖跟蹤等過程,局部地圖跟蹤需要用到3D地圖點、共視關系等元素,參考幀模型需要用到關鍵幀的BoW向量,重定位需要用到BoW向量、3D點等。所以基本上述元素都需要保存。

另一方面,關鍵幀也是一個抽象的概念(一個類),我們看看具體包含什么(其實都在關鍵幀類里面了),關鍵幀是從普通幀來的,所以來了視頻幀首先需要做的就是檢測特征點,計算描述符,還有當前幀的相機位姿,作為關鍵幀之后需要有對應的ID編號,以及特征點進行三角化之后的3D地圖點等。

關于3D地圖點需要保存的就只有世界坐標了,至于其它的關聯關系可以重關鍵幀獲得。需要單獨說的是在關鍵幀類中包含了特征點和描述符,所以BoW向量是不需要保存的(也沒辦法保存),只需要在加載了關鍵幀之后利用特征描述符重新計算即可。

所以現在需要保存的東西包括關鍵幀、3D地圖點、共視圖、生長樹

1.2 源碼修改

SLAM對地圖維護的操作均在Map.cc這個函數類中,所以要保存地圖,我們需要在這個文件中添加相應代碼。

第一步:修改Map.h頭文件

在Map.h文件中的Map類中添加如下函數:

public://保存地圖信息void Save(const string &filename);
protected://保存地圖點和關鍵幀 void SaveMapPoint(ofstream &f,MapPoint* mp);void SaveKeyFrame(ofstream &f,KeyFrame* kf);

第二步:修改Map.cc文件

在Map.cc文件中添加第一步中函數的實現。

Save()函數的實現過程:

 //保存地圖信息
void Map::Save ( const string& filename )
{//Print the information of the saving mapcerr<<"Map.cc :: Map Saving to "<<filename <<endl;ofstream f;f.open(filename.c_str(), ios_base::out|ios::binary);//Number of MapPointsunsigned long int nMapPoints = mspMapPoints.size();f.write((char*)&nMapPoints, sizeof(nMapPoints) );//Save MapPoint sequentiallyfor ( auto mp: mspMapPoints ){//Save MapPointSaveMapPoint( f, mp );// cerr << "Map.cc :: Saving map point number: " << mp->mnId << endl;}//Print The number of MapPointscerr << "Map.cc :: The number of MapPoints is :"<<mspMapPoints.size()<<endl;//Grab the index of each MapPoint, count from 0, in which we initialized mmpnMapPointsIdx  GetMapPointsIdx(); //Print the number of KeyFramescerr <<"Map.cc :: The number of KeyFrames:"<<mspKeyFrames.size()<<endl;//Number of KeyFramesunsigned long int nKeyFrames = mspKeyFrames.size();f.write((char*)&nKeyFrames, sizeof(nKeyFrames));//Save KeyFrames sequentiallyfor ( auto kf: mspKeyFrames )SaveKeyFrame( f, kf );for (auto kf:mspKeyFrames ){//Get parent of current KeyFrame and save the ID of this parentKeyFrame* parent = kf->GetParent();unsigned long int parent_id = ULONG_MAX;if ( parent )parent_id = parent->mnId;f.write((char*)&parent_id, sizeof(parent_id));//Get the size of the Connected KeyFrames of the current KeyFrames//and then save the ID and weight of the Connected KeyFramesunsigned long int nb_con = kf->GetConnectedKeyFrames().size();f.write((char*)&nb_con, sizeof(nb_con));for ( auto ckf: kf->GetConnectedKeyFrames()){int weight = kf->GetWeight(ckf);f.write((char*)&ckf->mnId, sizeof(ckf->mnId));f.write((char*)&weight, sizeof(weight));}}// Save last Frame ID// SaveFrameID(f);f.close();cerr<<"Map.cc :: Map Saving Finished!"<<endl;
}

存儲地圖點函數——SaveMapPoint()函數的實現:

void Map::SaveMapPoint( ofstream& f, MapPoint* mp)
{   //Save ID and the x,y,z coordinates of the current MapPointf.write((char*)&mp->mnId, sizeof(mp->mnId));cv::Mat mpWorldPos = mp->GetWorldPos();f.write((char*)& mpWorldPos.at<float>(0),sizeof(float));f.write((char*)& mpWorldPos.at<float>(1),sizeof(float));f.write((char*)& mpWorldPos.at<float>(2),sizeof(float));
}

存儲關鍵幀函數——SaveKeyFrame()函數的實現:

void Map::SaveKeyFrame( ofstream &f, KeyFrame* kf )
{//Save the ID and timesteps of current KeyFramef.write((char*)&kf->mnId, sizeof(kf->mnId));// cout << "saving kf->mnId = " << kf->mnId <<endl;f.write((char*)&kf->mTimeStamp, sizeof(kf->mTimeStamp));//Save the Pose Matrix of current KeyFramecv::Mat Tcw = kf->GetPose();Save the rotation matrix// for ( int i = 0; i < Tcw.rows; i ++ )// {//     for ( int j = 0; j < Tcw.cols; j ++ )//     {//         f.write((char*)&Tcw.at<float>(i,j), sizeof(float));//         //cerr<<"Tcw.at<float>("<<i<<","<<j<<"):"<<Tcw.at<float>(i,j)<<endl;//     }// }//Save the rotation matrix in Quaternionstd::vector<float> Quat = Converter::toQuaternion(Tcw);for ( int i = 0; i < 4; i ++ )f.write((char*)&Quat[i],sizeof(float));//Save the translation matrixfor ( int i = 0; i < 3; i ++ )f.write((char*)&Tcw.at<float>(i,3),sizeof(float));//Save the size of the ORB features current KeyFrame//cerr<<"kf->N:"<<kf->N<<endl;f.write((char*)&kf->N, sizeof(kf->N));//Save each ORB featuresfor( int i = 0; i < kf->N; i ++ ){cv::KeyPoint kp = kf->mvKeys[i];f.write((char*)&kp.pt.x, sizeof(kp.pt.x));f.write((char*)&kp.pt.y, sizeof(kp.pt.y));f.write((char*)&kp.size, sizeof(kp.size));f.write((char*)&kp.angle,sizeof(kp.angle));f.write((char*)&kp.response, sizeof(kp.response));f.write((char*)&kp.octave, sizeof(kp.octave));//Save the Descriptors of current ORB featuresf.write((char*)&kf->mDescriptors.cols, sizeof(kf->mDescriptors.cols)); //kf->mDescriptors.cols is always 32 here.for (int j = 0; j < kf->mDescriptors.cols; j ++ )f.write((char*)&kf->mDescriptors.at<unsigned char>(i,j), sizeof(char));//Save the index of MapPoints that corresponds to current ORB featuresunsigned long int mnIdx;MapPoint* mp = kf->GetMapPoint(i);if (mp == NULL  )mnIdx = ULONG_MAX;elsemnIdx = mmpnMapPointsIdx[mp];f.write((char*)&mnIdx, sizeof(mnIdx));}// Save BoW for relocalization.// f.write((char*)&kf->mBowVec, sizeof(kf->mBowVec));
}

Save()函數中的GetMapPointsIdx()函數用于獲取地圖點的ID號,所以需要在Map.h中定義如下成員變量:

std::map<MapPoint*,unsigned long int> mmpnMapPointsIdx;

GetMapPointsIdx()函數的實現過程為(在Map.cc文件中添加):

void Map::GetMapPointsIdx()
{unique_lock<mutex> lock(mMutexMap);unsigned long int i = 0;for ( auto mp: mspMapPoints ){mmpnMapPointsIdx[mp] = i;i += 1;}
}

第三步:修改Converter相關文件

關于旋轉矩陣的存儲可以通過四元數或矩陣的形式存儲,如果使用四元數需要自定義一個矩陣和四元數相互轉換的函數,在Converter.cc類里面添加如下函數:

cv::Mat Converter::toCvMat(const std::vector<float>& v)
{Eigen::Quaterniond q;q.x() = v[0];q.y() = v[1];q.z() = v[2];q.w() = v[3];Eigen::Matrix<double,3,3> eigMat(q);cv::Mat M = toCvMat(eigMat);return M;
}

第四步:System文件修改

上述修改完成之后,還需要對system.h和system.cc文件進行修改,分別添加聲明和定義。
system.h文件:

void SaveMap(const string &filename); 

system.cc文件

//地圖保存
void System::SaveMap(const string &filename)
{mpMap->Save(filename);
}

1.3 測試

做完這些修改之后,在Examples文件中對應的示例程序中加入地圖存儲代碼即可實現地圖存儲功能。
如在stereo_kitti.cc文件中加入如下語句:

//SLAM.SaveMap("/home/ORB_SLAM2/Examples/Stereo/map.bin");

2、地圖加載

地圖加載相當于地圖保存的逆過程,但是實際操作要相對麻煩一點。

2.1 源碼修改

地圖加載部分需要修改的較多,所以按所需修改的文件來進行說明。

第一步:Map相關文件修改

在Map.h文件中聲明地圖加載函數、地圖點加載函數和關鍵幀加載函數:

//加載地圖信息void Load(const string &filename,SystemSetting* mySystemSetting);MapPoint* LoadMapPoint(ifstream &f);KeyFrame* LoadKeyFrame(ifstream &f,SystemSetting* mySystemSetting);

在Map.cc文件中進行相應實現:

地圖加載函數

//地圖加載函數
void Map::Load ( const string &filename, SystemSetting* mySystemSetting)
{cerr << "Map.cc :: Map reading from:"<<filename<<endl;ifstream f;f.open( filename.c_str(),ios::binary );// Same as the sequence that we save the file, we first read the number of MapPoints.unsigned long int nMapPoints;f.read((char*)&nMapPoints, sizeof(nMapPoints));// Then read MapPoints one after another, and add them into the mapcerr<<"Map.cc :: The number of MapPoints:"<<nMapPoints<<endl;for ( unsigned int i = 0; i < nMapPoints; i ++ ){MapPoint* mp = LoadMapPoint(f);AddMapPoint(mp);}// Get all MapPointsstd::vector<MapPoint*> vmp = GetAllMapPoints();// Read the number of KeyFramesunsigned long int nKeyFrames;f.read((char*)&nKeyFrames, sizeof(nKeyFrames));cerr<<"Map.cc :: The number of KeyFrames:"<<nKeyFrames<<endl;// Then read KeyFrames one after another, and add them into the mapvector<KeyFrame*>kf_by_order;for( unsigned int i = 0; i < nKeyFrames; i ++ ){KeyFrame* kf = LoadKeyFrame(f, mySystemSetting);AddKeyFrame(kf);kf_by_order.push_back(kf);}cerr<<"Map.cc :: Max KeyFrame ID is: " << mnMaxKFid << ", and I set mnId to this number" <<endl;cerr<<"Map.cc :: KeyFrame Load OVER!"<<endl;// Read Spanning Tree(open loop trajectory)map<unsigned long int, KeyFrame*> kf_by_id;for ( auto kf: mspKeyFrames )kf_by_id[kf->mnId] = kf;cerr<<"Map.cc :: Start Load The Parent!"<<endl;for( auto kf: kf_by_order ){// Read parent_id of current KeyFrame.unsigned long int parent_id;f.read((char*)&parent_id, sizeof(parent_id));// Add parent KeyFrame to current KeyFrame.// cout<<"Map::Load : Add parent KeyFrame to current KeyFrame"<<endl;if ( parent_id != ULONG_MAX )kf->ChangeParent(kf_by_id[parent_id]);// Read covisibility graphs.// Read the number of Connected KeyFrames of current KeyFrame.unsigned long int nb_con;f.read((char*)&nb_con, sizeof(nb_con));// Read id and weight of Connected KeyFrames of current KeyFrame, // and add Connected KeyFrames into covisibility graph.// cout<<"Map::Load : Read id and weight of Connected KeyFrames"<<endl;for ( unsigned long int i = 0; i < nb_con; i ++ ){unsigned long int id;int weight;f.read((char*)&id, sizeof(id));f.read((char*)&weight, sizeof(weight));kf->AddConnection(kf_by_id[id],weight);}}cerr<<"Map.cc :: Parent Load OVER!"<<endl;for ( auto mp: vmp ){// cout << "Now mp = "<< mp << endl;if(mp){// cout << "compute for mp = "<< mp << endl;mp->ComputeDistinctiveDescriptors();// cout << "Computed Distinctive Descriptors." << endl;mp->UpdateNormalAndDepth();// cout << "Updated Normal And Depth." << endl;}}f.close();cerr<<"Map.cc :: Load IS OVER!"<<endl;return;
}

地圖點加載函數:

MapPoint* Map::LoadMapPoint( ifstream &f )
{// Position and Orientation of the MapPoints.cv::Mat Position(3,1,CV_32F);long unsigned int id;f.read((char*)&id, sizeof(id));f.read((char*)&Position.at<float>(0), sizeof(float));f.read((char*)&Position.at<float>(1), sizeof(float));f.read((char*)&Position.at<float>(2), sizeof(float));// Initialize a MapPoint, and set its id and Position.MapPoint* mp = new MapPoint(Position, this );mp->mnId = id;mp->SetWorldPos( Position );return mp;
}

關鍵幀加載函數:

KeyFrame* Map::LoadKeyFrame( ifstream &f, SystemSetting* mySystemSetting )
{InitKeyFrame initkf(*mySystemSetting);// Read ID and TimeStamp of each KeyFrame.f.read((char*)&initkf.nId, sizeof(initkf.nId));f.read((char*)&initkf.TimeStamp, sizeof(double));// Read position and quaternioncv::Mat T = cv::Mat::zeros(4,4,CV_32F);std::vector<float> Quat(4);//Quat.reserve(4);for ( int i = 0; i < 4; i ++ )f.read((char*)&Quat[i],sizeof(float));cv::Mat R = Converter::toCvMat(Quat);for ( int i = 0; i < 3; i ++ )f.read((char*)&T.at<float>(i,3),sizeof(float));for ( int i = 0; i < 3; i ++ )for ( int j = 0; j < 3; j ++ )T.at<float>(i,j) = R.at<float>(i,j);T.at<float>(3,3) = 1;// Read feature point number of current Key Framef.read((char*)&initkf.N, sizeof(initkf.N));initkf.vKps.reserve(initkf.N);initkf.Descriptors.create(initkf.N, 32, CV_8UC1);vector<float>KeypointDepth;std::vector<MapPoint*> vpMapPoints;vpMapPoints = vector<MapPoint*>(initkf.N,static_cast<MapPoint*>(NULL));// Read Keypoints and descriptors of current KeyFramestd::vector<MapPoint*> vmp = GetAllMapPoints();for(int i = 0; i < initkf.N; i ++ ){cv::KeyPoint kp;f.read((char*)&kp.pt.x, sizeof(kp.pt.x));f.read((char*)&kp.pt.y, sizeof(kp.pt.y));f.read((char*)&kp.size, sizeof(kp.size));f.read((char*)&kp.angle,sizeof(kp.angle));f.read((char*)&kp.response, sizeof(kp.response));f.read((char*)&kp.octave, sizeof(kp.octave));initkf.vKps.push_back(kp);// Read descriptors of keypointsf.read((char*)&initkf.Descriptors.cols, sizeof(initkf.Descriptors.cols));// for ( int j = 0; j < 32; j ++ ) // Since initkf.Descriptors.cols is always 32, for loop may also write like this.for ( int j = 0; j < initkf.Descriptors.cols; j ++ )f.read((char*)&initkf.Descriptors.at<unsigned char>(i,j),sizeof(char));// Read the mapping from keypoints to MapPoints.unsigned long int mpidx;f.read((char*)&mpidx, sizeof(mpidx));// Look up from vmp, which contains all MapPoints, MapPoint of current KeyFrame, and then insert in vpMapPoints.if( mpidx == ULONG_MAX )vpMapPoints[i] = NULL;elsevpMapPoints[i] = vmp[mpidx];}initkf.vRight = vector<float>(initkf.N,-1);initkf.vDepth = vector<float>(initkf.N,-1);//initkf.vDepth = KeypointDepth;initkf.UndistortKeyPoints();initkf.AssignFeaturesToGrid();// Use initkf to initialize a KeyFrame and set parametersKeyFrame* kf = new KeyFrame( initkf, this, NULL, vpMapPoints );kf->mnId = initkf.nId;kf->SetPose(T);kf->ComputeBoW();for ( int i = 0; i < initkf.N; i ++ ){if ( vpMapPoints[i] ){vpMapPoints[i]->AddObservation(kf,i);if( !vpMapPoints[i]->GetReferenceKeyFrame())vpMapPoints[i]->SetReferenceKeyFrame(kf);}}return kf;
}

第二步:MapPoint相關文件修改

由于在加載地圖時我們只有Position以及當前的Map,所以需要重新定義一種MapPoint類的構造函數以滿足要求。

在MapPoint.h文件中添加如下構造函數:

MapPoint(const cv::Mat &Pos,Map* pMap);

在MapPoint.cc文件中實現該構造函數:

MapPoint::MapPoint(const cv::Mat &Pos,Map* pMap):mnFirstKFid(0), mnFirstFrame(0), nObs(0), mnTrackReferenceForFrame(0), mnLastFrameSeen(0), mnBALocalForKF(0), mnFuseCandidateForKF(0), mnLoopPointForKF(0), mnCorrectedByKF(0),mnCorrectedReference(0), mnBAGlobalForKF(0), mpRefKF(static_cast<KeyFrame*>(NULL)), mnVisible(1), mnFound(1), mbBad(false),mpReplaced(static_cast<MapPoint*>(NULL)), mfMinDistance(0), mfMaxDistance(0), mpMap(pMap)
{Pos.copyTo(mWorldPos);mNormalVector = cv::Mat::zeros(3,1,CV_32F);unique_lock<mutex> lock(mpMap->mMutexPointCreation);mnId = nNextId++;
}

此外,還需要添加如下函數:

KeyFrame* SetReferenceKeyFrame(KeyFrame* RFKF);
KeyFrame* MapPoint::SetReferenceKeyFrame(KeyFrame* RFKF)
{return mpRefKF = RFKF;
}

第三步:KeyFrame相關文件修改

與MapPoint文件相同,KeyFrame文件也要做相關修改。

在KeyFrame.h文件中添加如下構造函數:

KeyFrame(InitKeyFrame &initkf,Map* pMap,KeyFrameDatabase* pKFDB,vector<MapPoint*>& vpMapPoints);

在KeyFrame.cc文件中實現該構造函數:

KeyFrame::KeyFrame(InitKeyFrame &initkf, Map *pMap, KeyFrameDatabase *pKFDB, vector<MapPoint*> &vpMapPoints):mnFrameId(0), mTimeStamp(initkf.TimeStamp), mnGridCols(FRAME_GRID_COLS), mnGridRows(FRAME_GRID_ROWS),mfGridElementWidthInv(initkf.fGridElementWidthInv), mfGridElementHeightInv(initkf.fGridElementHeightInv),mnTrackReferenceForFrame(0), mnFuseTargetForKF(0), mnBALocalForKF(0), mnBAFixedForKF(0),mnLoopQuery(0), mnLoopWords(0), mnRelocQuery(0), mnRelocWords(0), mnBAGlobalForKF(0),fx(initkf.fx), fy(initkf.fy), cx(initkf.cx), cy(initkf.cy), invfx(initkf.invfx),invfy(initkf.invfy), mbf(initkf.bf), mb(initkf.b), mThDepth(initkf.ThDepth), N(initkf.N),mvKeys(initkf.vKps), mvKeysUn(initkf.vKpsUn), mvuRight(initkf.vRight), mvDepth(initkf.vDepth),mDescriptors(initkf.Descriptors.clone()), mBowVec(initkf.BowVec), mFeatVec(initkf.FeatVec),mnScaleLevels(initkf.nScaleLevels), mfScaleFactor(initkf.fScaleFactor), mfLogScaleFactor(initkf.fLogScaleFactor),mvScaleFactors(initkf.vScaleFactors), mvLevelSigma2(initkf.vLevelSigma2),mvInvLevelSigma2(initkf.vInvLevelSigma2),mnMinX(initkf.nMinX), mnMinY(initkf.nMinY), mnMaxX(initkf.nMaxX), mnMaxY(initkf.nMaxY), mK(initkf.K),mvpMapPoints(vpMapPoints), mpKeyFrameDB(pKFDB), mpORBvocabulary(initkf.pVocabulary),mbFirstConnection(true), mpParent(NULL), mbNotErase(false), mbToBeErased(false), mbBad(false),mHalfBaseline(initkf.b/2), mpMap(pMap){mnId = nNextId ++;}

不要忘記在KeyFrame.h中添加相應頭文件和命名空間中的類聲明

第四步:SystemSetting和InitKeyFrame相關文件

在上面的函數中我們用到了SystemSetting類和InitKeyFrame類。其中SystemSetting類用于讀取參數文件中的相關參數,InitKeyFrame類用于進行關鍵幀初始化。其實現過程如下:

SystemSetting.h

#ifndef SYSTEMSETTING_H
#define SYSTEMSETTING_H#include<string>
#include"ORBVocabulary.h"
#include<opencv2/opencv.hpp>namespace ORB_SLAM2 {class SystemSetting{public:SystemSetting(ORBVocabulary* pVoc);bool LoadSystemSetting(const std::string strSettingPath);public:ORBVocabulary* pVocavulary;//相機參數float width;float height;float fx;float fy;float cx;float cy;float invfx;float invfy;float bf;float b;float fps;cv::Mat K;cv::Mat DistCoef;bool initialized;//相機 RGB 參數int nRGB;//ORB特征參數int nFeatures;float fScaleFactor;int nLevels;float fIniThFAST;float fMinThFAST;//其他參數float ThDepth = -1;float DepthMapFactor = -1;};}//namespace ORB_SLAM2#endif //SystemSetting

SystemSetting.cc的函數具體實現:

#include<iostream>
#include"SystemSetting.h"using namespace std;namespace ORB_SLAM2 {SystemSetting::SystemSetting(ORBVocabulary* pVoc):pVocavulary(pVoc){}bool SystemSetting::LoadSystemSetting(const std::string strSettingPath){cout<<endl<<"Loading System Parameters form:"<<strSettingPath<<endl;cv::FileStorage fSettings(strSettingPath, cv::FileStorage::READ);width  = fSettings["Camera.width"];height = fSettings["Camera.height"];fx     = fSettings["Camera.fx"];fy     = fSettings["Camera.fy"];cx     = fSettings["Camera.cx"];cy     = fSettings["Camera.cy"];cv::Mat tmpK = cv::Mat::eye(3,3,CV_32F);tmpK.at<float>(0,0) = fx;tmpK.at<float>(1,1) = fy;tmpK.at<float>(0,2) = cx;tmpK.at<float>(1,2) = cy;tmpK.copyTo(K);cv::Mat tmpDistCoef(4,1,CV_32F);tmpDistCoef.at<float>(0) = fSettings["Camera.k1"];tmpDistCoef.at<float>(1) = fSettings["Camera.k2"];tmpDistCoef.at<float>(2) = fSettings["Camera.p1"];tmpDistCoef.at<float>(3) = fSettings["Camera.p2"];const float k3 = fSettings["Camera.k3"];if( k3!=0 ){tmpDistCoef.resize(5);tmpDistCoef.at<float>(4) = k3;}tmpDistCoef.copyTo( DistCoef );bf = fSettings["Camera.bf"];fps= fSettings["Camera.fps"];invfx = 1.0f/fx;invfy = 1.0f/fy;b     = bf  /fx;initialized = true;cout<<"- size:"<<width<<"x"<<height<<endl;cout<<"- fx:"  <<fx<<endl;cout << "- fy: " << fy << endl;cout << "- cx: " << cx << endl;cout << "- cy: " << cy << endl;cout << "- k1: " << DistCoef.at<float>(0) << endl;cout << "- k2: " << DistCoef.at<float>(1) << endl;if(DistCoef.rows==5)cout << "- k3: " << DistCoef.at<float>(4) << endl;cout << "- p1: " << DistCoef.at<float>(2) << endl;cout << "- p2: " << DistCoef.at<float>(3) << endl;cout << "- bf: " << bf << endl;//Load RGB parameternRGB = fSettings["Camera.RGB"];//Load ORB feature parametersnFeatures = fSettings["ORBextractor.nFeatures"];fScaleFactor = fSettings["ORBextractor.scaleFactor"];nLevels = fSettings["ORBextractor.nLevels"];fIniThFAST = fSettings["ORBextractor.iniThFAST"];fMinThFAST = fSettings["ORBextractor.minThFAST"];cout << endl  << "ORB Extractor Parameters: " << endl;cout << "- Number of Features: " << nFeatures << endl;cout << "- Scale Levels: " << nLevels << endl;cout << "- Scale Factor: " << fScaleFactor << endl;cout << "- Initial Fast Threshold: " << fIniThFAST << endl;cout << "- Minimum Fast Threshold: " << fMinThFAST << endl;//Load others parameters, if the sensor is MONOCULAR, the parameters is zero;//ThDepth = fSettings["ThDepth"];//DepthMapFactor = fSettings["DepthMapFactor"];fSettings.release();return true;}
}

InitKeyFrame.h文件

#ifndef INITKEYFRAME_H
#define INITKEYFRAME_H#include "Thirdparty/DBoW2/DBoW2/BowVector.h"
#include "Thirdparty/DBoW2/DBoW2/FeatureVector.h"
#include "SystemSetting.h"
#include <opencv2/opencv.hpp>
#include "ORBVocabulary.h"
#include "KeyFrameDatabase.h"
//#include "MapPoints.h"namespace ORB_SLAM2
{#define FRAME_GRID_ROWS 48
#define FRAME_GRID_COLS 64class SystemSetting;
class KeyFrameDatabase;
//class ORBVocabulary;class InitKeyFrame
{
public:    InitKeyFrame(SystemSetting &SS);void UndistortKeyPoints();bool PosInGrid(const cv::KeyPoint& kp, int &posX, int &posY);void AssignFeaturesToGrid();public:ORBVocabulary* pVocabulary;//KeyFrameDatabase* pKeyFrameDatabase;long unsigned int nId;double TimeStamp;float fGridElementWidthInv;float fGridElementHeightInv;std::vector<std::size_t> vGrid[FRAME_GRID_COLS][FRAME_GRID_ROWS];float fx;float fy;float cx;float cy;float invfx;float invfy;float bf;float b;float ThDepth;int N;std::vector<cv::KeyPoint> vKps;std::vector<cv::KeyPoint> vKpsUn;cv::Mat Descriptors;//it's zero for monostd::vector<float> vRight;std::vector<float> vDepth;DBoW2::BowVector BowVec;DBoW2::FeatureVector FeatVec;int nScaleLevels;float fScaleFactor;float fLogScaleFactor;std::vector<float> vScaleFactors;std::vector<float> vLevelSigma2;std::vector<float> vInvLevelSigma2;std::vector<float> vInvScaleFactors;int nMinX;int nMinY;int nMaxX;int nMaxY;cv::Mat K;cv::Mat DistCoef;    };} //namespace ORB_SLAM2
#endif //INITKEYFRAME_H

InitKeyFrame.cc的函數具體實現:

#include "InitKeyFrame.h"
#include <opencv2/opencv.hpp>
#include "SystemSetting.h"namespace ORB_SLAM2
{InitKeyFrame::InitKeyFrame(SystemSetting &SS):pVocabulary(SS.pVocavulary)//, pKeyFrameDatabase(SS.pKeyFrameDatabase)
{fx = SS.fx;fy = SS.fy;cx = SS.cx;cy = SS.cy;invfx = SS.invfx;invfy = SS.invfy;bf = SS.bf;b  = SS.b;ThDepth = SS.ThDepth;nScaleLevels = SS.nLevels;fScaleFactor = SS.fScaleFactor;fLogScaleFactor = log(SS.fScaleFactor);vScaleFactors.resize(nScaleLevels);vLevelSigma2.resize(nScaleLevels);vScaleFactors[0] = 1.0f;vLevelSigma2[0]  = 1.0f;for ( int i = 1; i < nScaleLevels; i ++ ){vScaleFactors[i] = vScaleFactors[i-1]*fScaleFactor;vLevelSigma2[i]  = vScaleFactors[i]*vScaleFactors[i];}vInvScaleFactors.resize(nScaleLevels);vInvLevelSigma2.resize(nScaleLevels);for ( int i = 0; i < nScaleLevels; i ++ ){vInvScaleFactors[i] = 1.0f/vScaleFactors[i];vInvLevelSigma2[i]  = 1.0f/vLevelSigma2[i];}K = SS.K;DistCoef = SS.DistCoef;if( SS.DistCoef.at<float>(0)!=0.0){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) = SS.width;mat.at<float>(1,1) = 0.0;mat.at<float>(2,0) = 0.0;mat.at<float>(2,1) = SS.height;mat.at<float>(3,0) = SS.width;mat.at<float>(3,1) = SS.height;mat = mat.reshape(2);cv::undistortPoints(mat, mat, SS.K, SS.DistCoef, cv::Mat(), SS.K);mat = mat.reshape(1);nMinX = min(mat.at<float>(0,0), mat.at<float>(2,0));nMaxX = max(mat.at<float>(1,0), mat.at<float>(3,0));nMinY = min(mat.at<float>(0,1), mat.at<float>(1,1));nMaxY = max(mat.at<float>(2,1), mat.at<float>(3,1));}else{nMinX = 0.0f;nMaxX = SS.width;nMinY = 0.0f;nMaxY = SS.height;}fGridElementWidthInv=static_cast<float>(FRAME_GRID_COLS)/(nMaxX-nMinX);fGridElementHeightInv=static_cast<float>(FRAME_GRID_ROWS)/(nMaxY-nMinY);}void InitKeyFrame::UndistortKeyPoints()
{if( DistCoef.at<float>(0) == 0.0){vKpsUn = vKps;return;}cv::Mat mat(N,2,CV_32F);for ( int i = 0; i < N; i ++ ){mat.at<float>(i,0) = vKps[i].pt.x;mat.at<float>(i,1) = vKps[i].pt.y;}mat = mat.reshape(2);cv::undistortPoints(mat, mat, K, DistCoef, cv::Mat(), K );mat = mat.reshape(1);vKpsUn.resize(N);for( int i = 0; i < N; i ++ ){cv::KeyPoint kp = vKps[i];kp.pt.x = mat.at<float>(i,0);kp.pt.y = mat.at<float>(i,1);vKpsUn[i] = kp;}
}void InitKeyFrame::AssignFeaturesToGrid()
{int nReserve = 0.5f*N/(FRAME_GRID_COLS*FRAME_GRID_ROWS);for ( unsigned int i = 0; i < FRAME_GRID_COLS; i ++ ){for ( unsigned int j = 0; j < FRAME_GRID_ROWS; j ++)vGrid[i][j].reserve(nReserve);}for ( int i = 0; i < N; i ++ ){const cv::KeyPoint& kp = vKpsUn[i];int nGridPosX, nGridPosY;if( PosInGrid(kp, nGridPosX, nGridPosY))vGrid[nGridPosX][nGridPosY].push_back(i);}
}bool InitKeyFrame::PosInGrid(const cv::KeyPoint &kp, int &posX,  int &posY)
{posX = round((kp.pt.x-nMinX)*fGridElementWidthInv);posY = round((kp.pt.y-nMinY)*fGridElementHeightInv);if(posX<0 || posX>=FRAME_GRID_COLS ||posY<0 || posY>=FRAME_GRID_ROWS)return false;return true;
}}

第五步:System相關文件的修改

在System.h中添加函數定義:

void LoadMap(const string &filename);

并在對應的System.cc中添加了定義

//地圖加載
void System::LoadMap(const string &filename)
{SystemSetting* mySystemSetting = new SystemSetting(mpVocabulary);mySystemSetting->LoadSystemSetting(mySettingFile);mpMap->Load(filename,mySystemSetting);
}

還需要在System.h中添加聲明

 std::string mySettingFile;

同時在構造函數函數中對mySettingFile成員變量賦值

 mySettingFile = strSettingsFile;

2.2 測試

做完這些修改之后 ,不要忘記修改CMakeLists.txt 文件。

#在add_library 中加入 src/InitkeyFrame.cc src/SystemSetting.cc
add_library(${PROJECT_NAME} SHARED
src/System.cc
src/Tracking.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/ORBextractor.cc
src/ORBmatcher.cc
src/FrameDrawer.cc
src/Converter.cc
src/MapPoint.cc
src/KeyFrame.cc
src/Map.cc
src/MapDrawer.cc
src/Optimizer.cc
src/PnPsolver.cc
src/Frame.cc
src/KeyFrameDatabase.cc
src/Sim3Solver.cc
src/Initializer.cc
src/Viewer.cc
src/InitkeyFrame.cc
src/SystemSetting.cc
)

重新編譯程序,然后在Examples文件中對應的示例程序中加入地圖加載代碼即可實現地圖加載功能。
如在stereo_kitti.cc文件中加入如下語句:

SLAM.LoadMap("/home/ORB_SLAM2/Examples/Stereo/map.bin");

效果如下圖:

謝謝!如有錯誤歡迎指正,感謝其他大神的參考博客!

總結

以上是生活随笔為你收集整理的(一次性搞定)ORB_SLAM2地图保存与加载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美精品999 | 久久精品中文 | 久久久国产精品人人片99精片欧美一 | 玖玖在线视频观看 | 日本成人中文字幕在线观看 | 日日干天天爽 | 天天综合在线观看 | 中文字幕在线视频第一页 | 十八岁以下禁止观看的1000个网站 | 麻豆视频在线观看免费 | 亚洲国产精品资源 | 国产在线精品播放 | 成人国产精品久久久久久亚洲 | 日韩在线精品一区 | 一区二区三区精品久久久 | 香蕉影视app | 黄色成人91 | 国产成人福利在线观看 | 午夜视频在线观看欧美 | av中文字幕网站 | 激情五月看片 | 久久99久久99精品免视看婷婷 | 国产精品手机在线播放 | 99视频在线精品 | 婷婷色在线播放 | 国产精品成人自产拍在线观看 | 99国产在线 | 亚洲精品视频在线观看视频 | 久久免费视频3 | 4438全国亚洲精品在线观看视频 | 亚洲人人射 | 亚洲国产小视频在线观看 | 国产亚洲小视频 | 六月丁香婷婷久久 | 美女网站在线观看 | 欧美激情视频在线免费观看 | 久草免费新视频 | 久久久www| 久久国产一区二区三区 | 在线免费观看视频a | 亚洲国产成人在线观看 | 亚洲一区 影院 | 国产成人av一区二区三区在线观看 | 国产综合在线视频 | 国产精品高潮呻吟久久av无 | 99国内精品久久久久久久 | 免费在线观看日韩 | 中文字幕黄色网址 | 国产一二区视频 | 黄色免费高清视频 | 日韩欧美成人网 | 国产精品成久久久久三级 | 欧美ⅹxxxxxx| 91久久影院| 成人黄色在线电影 | 日韩精品第一区 | 国产精品久久网 | 久久久国产精华液 | 不卡av在线| 成人小视频在线观看免费 | 婷婷色五 | 色综合色综合久久综合频道88 | 婷婷在线色 | 在线播放91 | a v在线观看 | 亚洲精品高清在线 | 久久免费福利视频 | 午夜精品剧场 | 国产在线视频不卡 | www.天天成人国产电影 | 超碰九九 | 激情伊人五月天久久综合 | 中文字幕在线视频一区 | 久久久久亚洲天堂 | 日韩三级视频在线观看 | 亚洲爱爱视频 | 亚洲国产午夜 | 国产精品乱码高清在线看 | 国产在线更新 | a电影在线观看 | 亚州性色| 91香蕉久久 | 91精品蜜桃 | 五月的婷婷 | 一本一本久久a久久精品牛牛影视 | www.久久99| 国产精品精品久久久久久 | 日精品在线观看 | 人人超在线公开视频 | 中文字幕av全部资源www中文字幕在线观看 | 色网免费观看 | 1024久久| 欧美日韩国产一区二区三区 | 国产精品久久久久av福利动漫 | 成人免费视频网站在线观看 | 国产精品中文在线 | 中文字幕精品三区 | 国产高清不卡一区二区三区 | 国产五十路毛片 | 天堂v中文 | 亚洲精品网址在线观看 | 69中文字幕 | 91在线视频观看 | 亚洲综合成人av | 亚洲最大的av网站 | 国语精品免费视频 | 一区国产精品 | 国产成人61精品免费看片 | 久久久国产精品亚洲一区 | 久青草国产在线 | 91传媒91久久久 | 蜜臀久久99精品久久久无需会员 | 国产一卡二卡四卡国 | 国产一二区视频 | 99在线视频精品 | 一级黄色在线免费观看 | 国产99一区二区 | 2019国产精品 | 国产在线视频在线观看 | 精品黄色在线观看 | 国产午夜精品一区二区三区欧美 | 亚洲狠狠操 | 超碰在线日韩 | 91人人爽人人爽人人精88v | 日韩欧美精品在线 | 天天综合久久 | 最新av网址大全 | 久久国产精品系列 | 国产一区二区成人 | 久久久国产一区二区三区 | 国产精品去看片 | 国产偷国产偷亚洲清高 | 久草精品视频在线播放 | 欧美日韩国产一二 | 亚洲九九影院 | 午夜精品久久久久久久久久久久久久 | 人人澡超碰碰 | 久色伊人 | 99草视频 | 99热精品国产一区二区在线观看 | 国产一级视频免费看 | 人人爽人人片 | 国产精品成人免费一区久久羞羞 | 在线观看av国产 | 免费视频一区二区 | 美女网站视频一区 | 99精品小视频 | 欧美精品乱码久久久久久 | 精品国产乱码久久久久久久 | 超碰在线亚洲 | 国产精品a级| 国产中文字幕三区 | 天天操一操| 日韩精品一区二区免费视频 | 国产不卡免费视频 | 亚洲高清在线 | 亚洲精品国产成人 | 99久久久国产精品免费99 | 91精品免费在线视频 | www在线免费观看 | 高清av中文在线字幕观看1 | 日韩专区 在线 | 精品久久久久国产 | 成人黄色影片在线 | 福利久久久 | 国产一区二区在线免费 | 亚洲在线网址 | 亚洲欧美日韩一级 | 国产精品第二十页 | 国内精品美女在线观看 | 人人爽人人澡人人添人人人人 | 成人午夜毛片 | 久久刺激视频 | 国产中文字幕一区 | 欧美三级在线播放 | 国产又粗又猛又爽又黄的视频免费 | 98精品国产自产在线观看 | 精品国产欧美 | 亚洲 欧美日韩 国产 中文 | 色播五月婷婷 | 久久久久久久影视 | 亚洲传媒在线 | 国产99久久99热这里精品5 | 中文字幕在线视频一区二区三区 | 91成人精品| 麻豆成人在线观看 | 超碰在线个人 | 热久精品 | 丁香婷婷在线观看 | 看全黄大色黄大片 | 欧美福利精品 | 日本韩国精品一区二区在线观看 | 久久综合色综合88 | 国产麻豆视频网站 | 9999毛片 | 一区二区三区不卡在线 | 国产精品激情 | 亚洲人成影院在线 | 成人av电影免费在线播放 | av电影免费| 色老板在线视频 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 全黄网站| 99综合电影在线视频 | 手机成人免费视频 | 毛片基地黄久久久久久天堂 | 欧美日韩在线观看一区 | 999久久久免费精品国产 | 国产91九色视频 | av综合av| 精品在线视频一区二区三区 | 又黄又爽又色无遮挡免费 | 在线视频99| 黄色中文字幕 | 国产精品视频久久 | 婷婷色视频 | 成人免费在线观看电影 | 在线a人片免费观看视频 | 中文字幕av专区 | 色噜噜日韩精品一区二区三区视频 | 成人精品久久 | 日韩高清 一区 | 麻豆 91 在线| 在线日韩中文字幕 | 在线中文字幕视频 | av一级在线观看 | 日日爱影视 | 久久6精品 | 日本高清免费中文字幕 | 狠狠色丁香久久婷婷综合丁香 | 人人玩人人添人人澡97 | 99热在线观看 | 美女黄频在线观看 | 国产.精品.日韩.另类.中文.在线.播放 | 在线天堂中文www视软件 | 国产精品大片在线观看 | 九九免费精品 | 国产手机免费视频 | 国产区精品视频 | 国内精品视频一区二区三区八戒 | 一区二区高清在线 | 国产中文视频 | 伊人网av | 日韩成人中文字幕 | 欧美激情精品久久久 | 9免费视频| 国产精品久久久久久超碰 | av成人免费观看 | 久久成人麻豆午夜电影 | 懂色av懂色av粉嫩av分享吧 | 国产日韩亚洲 | 国产日韩欧美在线观看 | 精品一区精品二区高清 | 国产麻豆视频网站 | 久久天天躁狠狠躁亚洲综合公司 | 韩国一区二区三区在线观看 | 免费日韩av片 | 久久精品网址 | 99视频精品免费观看, | 爱色婷婷 | 国产1区在线观看 | 麻豆国产精品永久免费视频 | 日韩在线视频不卡 | av免费在线免费观看 | 最新av免费在线观看 | a在线观看视频 | 激情五月婷婷激情 | 手机色站 | 日韩成人黄色av | 色久五月| 国产精品成 | 国产专区一| 激情久久五月 | 91精品天码美女少妇 | 精品一区二区免费在线观看 | 日韩在线观看影院 | www视频在线免费观看 | 激情综合网五月婷婷 | 黄色字幕网 | 成在人线av | 成年人黄色免费网站 | 中文字幕丝袜制服 | h视频日本 | 天天综合91 | 天天色天天操综合 | 国外成人在线视频网站 | 亚洲乱码精品久久久久 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 久久麻豆视频 | 国产成人一二三 | 久草五月 | 国产四虎在线 | 最近中文字幕在线播放 | 成年人在线免费看片 | 69视频在线 | 7777精品伊人久久久大香线蕉 | 亚洲美女免费精品视频在线观看 | 四虎在线观看精品视频 | 丁香综合av | 国产精品色视频 | 久久精品国产亚洲a | 九九视频免费观看视频精品 | 成人在线视频免费看 | 黄色成人在线观看 | av高清网站在线观看 | 毛片永久新网址首页 | 国产婷婷精品av在线 | 九九热中文字幕 | 久久不卡免费视频 | 午夜18视频在线观看 | 精品中文字幕视频 | 精选久久 | 伊人影院99 | 中文字幕免费高清在线 | 午夜精品一区二区三区免费 | 91亚洲精品在线 | 成人精品福利 | 亚洲aaa级| 中文一区在线 | 黄色在线网站噜噜噜 | 日韩电影中文字幕 | 99免在线观看免费视频高清 | 激情五月色播五月 | 欧美 日韩 国产 中文字幕 | 又黄又网站 | 日韩电影中文,亚洲精品乱码 | 久久不射电影院 | 久草亚洲视频 | 久久国产精品久久国产精品 | 97视频人人澡人人爽 | 96亚洲精品久久 | 999久久久免费精品国产 | 国产精品一区二区在线 | 一区二区三区高清在线 | 亚洲电影图片小说 | 麻豆视频免费观看 | 伊人天天干 | av天天在线观看 | 亚洲一区二区精品3399 | a色视频| 天天操天天吃 | 国产精品第二十页 | 深夜福利视频一区二区 | 美女福利视频 | 超碰.com| 天天爱天天操 | 在线中文字幕观看 | 免费高清看电视网站 | 国产91在| 在线精品在线 | 欧美 日韩 久久 | 亚洲一二三久久 | 婷婷丁香综合 | 狠狠伊人 | 日韩成人免费在线观看 | 欧美精品一区二区蜜臀亚洲 | 国产91精品看黄网站 | 91精品办公室少妇高潮对白 | 国产视频精品免费 | 国产一级a毛片视频爆浆 | 国产一区二区久久久 | 在线视频观看91 | 天天综合五月天 | 日韩精品一区二区三区高清免费 | 欧美日韩精品影院 | 999久久久久久久久久久 | 久久乐九色婷婷综合色狠狠182 | 黄色一区二区在线观看 | 久久久三级视频 | 中文国产字幕 | 久久综合影视 | 欧美午夜激情网 | 黄色录像av | 人人看人人爱 | 91精品欧美 | 国产成人在线观看免费 | 成人精品视频 | 丁香五月亚洲综合在线 | 国产一区二区在线免费 | 国产精品电影一区二区 | 成人午夜剧场在线观看 | 91精品久久久久久久久久入口 | 五月婷婷在线视频 | 日韩中文字幕亚洲一区二区va在线 | 婷婷色吧| 91精品视频免费看 | 日韩毛片久久久 | 国产精品第三页 | 久久伊人精品一区二区三区 | 国产一卡久久电影永久 | av观看久久久 | 久久污视频 | 国产91大片 | 国产精品久久久久久吹潮天美传媒 | 久草爱| 国产在线一区观看 | 精品久久久久久亚洲综合网站 | 精品久操 | 久免费视频 | 99热99 | 五月天欧美精品 | 国产无区一区二区三麻豆 | 日韩在线首页 | 日韩中文字幕视频在线观看 | 狠狠色丁香婷婷综合 | 久久91网 | 免费色视频 | 激情综合网天天干 | 国产99久久久国产精品成人免费 | 又黄又爽又刺激的视频 | 成人黄色电影在线播放 | 久久久久久久综合色一本 | 日韩免费在线播放 | 91精品日韩 | 免费av影视 | 精品久久久久久电影 | 丝袜精品视频 | 中文乱幕日产无线码1区 | 波多野结衣视频一区二区三区 | 久草网站 | 在线观看岛国片 | 麻豆影视在线观看 | 午夜av电影 | 亚洲精品在线一区二区 | 丁香婷婷激情国产高清秒播 | 九九热久久久 | 国产精品国产三级国产aⅴ入口 | 天天干视频在线 | 亚洲精品在线免费观看视频 | 中文免费 | 久久99久| 欧美一区三区四区 | www.狠狠操.com| 精品uu| 成人a级免费视频 | 中文字幕在线一区二区三区 | www.com久久久| 成人黄色小视频 | 亚洲成人家庭影院 | 色狠狠操 | 97精品久久人人爽人人爽 | 日本特黄特色aaa大片免费 | 国产99一区视频免费 | 国产亚洲在线 | 欧美 日韩 视频 | 男女免费视频观看 | 国产精品女同一区二区三区久久夜 | 欧美日韩三级在线观看 | 国产精品久久久久久久久久新婚 | 国产精品视频久久 | www.色婷婷.com| 久久精品视频18 | 91成品人影院 | 麻豆视频在线播放 | 午夜国产福利在线观看 | 在线三级播放 | 看毛片网站| 精品国产欧美一区二区三区不卡 | 亚洲黄色在线免费观看 | 中文字幕在线第一页 | 国产成视频在线观看 | 久久精品一级片 | 国产精品理论视频 | 国产91精品看黄网站在线观看动漫 | 日批网站免费观看 | 狠狠五月天 | 美女在线黄 | av五月婷婷| 欧美xxxxx在线视频 | 黄色免费视频在线观看 | 欧美日韩高清一区 | 国产在线播放一区二区 | 人人爽久久久噜噜噜电影 | 精品国产精品久久一区免费式 | 伊人va | 99视频精品全部免费 在线 | 999成人精品 | 日韩精品一区二区三区免费视频观看 | 97香蕉超级碰碰久久免费软件 | 国产日产精品一区二区三区四区 | 午夜精品久久久久久久爽 | 91亚洲精品久久久久图片蜜桃 | 国产不卡在线 | 日韩在线视频在线观看 | 天天射射天天 | 性色av香蕉一区二区 | 久久免费视频一区 | 国产 视频 久久 | 青草视频在线 | 不卡视频一区二区三区 | 国产香蕉97碰碰碰视频在线观看 | 久久人人爽人人片 | 欧美日韩一区二区三区视频 | 国产一区视频在线观看免费 | 操老逼免费视频 | 久久影院精品 | 日本在线观看中文字幕 | 久久久久久久国产精品 | 久久人人插| 久久久久久久久久久网 | 91精品在线麻豆 | 精品久久久久一区二区国产 | 久久综合加勒比 | 中文字幕888| 日韩精品一区二区三区免费观看 | 久久久久久久久影视 | 亚洲国产美女精品久久久久∴ | 伊人精品在线 | 亚洲国产高清视频 | 日韩无在线 | 日韩精品在线视频免费观看 | 成人黄色影片在线 | 91自拍视频在线观看 | 麻豆精品传媒视频 | 一区二区三区在线观看中文字幕 | 久久免费的视频 | 中文字幕中文字幕在线中文字幕三区 | 在线观看免费一级片 | 欧美视频在线观看免费网址 | 久久久久久久久久久网 | 国产精品亚 | 99久久精品国产欧美主题曲 | 日韩成人免费在线电影 | av黄网站 | 在线亚洲播放 | 色综合激情久久 | 91麻豆精品久久久久久 | 日韩超碰 | 91爱爱网址 | 在线观看中文字幕2021 | 中字幕视频在线永久在线观看免费 | 在线观看深夜视频 | 欧美大jb | 亚洲丝袜一区 | 欧美日一级片 | 一本一道久久a久久精品蜜桃 | 国产又黄又爽又猛视频日本 | 亚洲精品美女久久17c | 99精品视频在线观看免费 | 欧美在线观看小视频 | 91精品免费在线观看 | 久久免费激情视频 | 免费看黄在线网站 | 婷婷丁香激情网 | 日韩精品一区二区三区免费观看 | 天堂资源在线观看视频 | 久久高清 | 久久激情网站 | 伊人国产女 | 有码视频在线观看 | 久草在线精品观看 | 国产麻豆视频在线观看 | 中国一级特黄毛片大片久久 | 热久在线 | 麻豆精品在线视频 | 国产高清视频免费在线观看 | 亚洲精品综合久久 | 久黄色 | 亚洲欧美在线观看视频 | 美女国产精品 | 狂野欧美激情性xxxx | 天天操夜夜拍 | 一区二区视频欧美 | 一区二区精品视频 | 日韩欧美高清一区二区 | 精品国产视频在线观看 | 激情网在线视频 | 91免费版在线观看 | 欧美另类性 | 免费av黄色 | 在线影视 一区 二区 三区 | 免费av网站观看 | 激情电影影院 | 四虎影视成人精品 | 国产精品精品国产婷婷这里av | 六月丁香激情综合色啪小说 | 国产精品免费在线 | www中文在线 | 欧洲精品一区二区 | 久久成人资源 | av亚洲产国偷v产偷v自拍小说 | 亚洲va欧洲va国产va不卡 | 亚洲天堂网在线观看视频 | 国产xx视频| 午夜色性片 | 久久丁香 | 精品亚洲成人 | 日韩一级电影在线 | 国产人成在线视频 | 三级av中文字幕 | 免费av试看 | 色婷婷狠| 成人avav | 欧美日韩国产亚洲乱码字幕 | 久久成人人人人精品欧 | 久久精品99国产精品日本 | 九九免费在线看完整版 | www视频在线播放 | 日韩久久精品一区二区 | 色婷婷激情电影 | 成人四虎影院 | 99国产一区 | 91mv.cool在线观看 | 午夜精品三区 | 伊人va| 日韩高清一二三区 | 少妇bbbb | 亚洲精品99 | 911香蕉| 午夜av电影院 | 日本一区二区不卡高清 | avcom在线| 午夜私人影院久久久久 | 国产精品久久久久久婷婷天堂 | 国产精品专区在线观看 | 久久看片网站 | 久久久久成人精品免费播放动漫 | 国产精品国产亚洲精品看不卡 | 国产一区二区三区免费视频 | 91精品国产网站 | 日精品 | 免费久久网| 成人资源网 | 午夜精品福利一区二区 | 日韩特级毛片 | 天天天天天天天操 | 啪啪肉肉污av国网站 | 综合网天天 | 国产九色91| 区一区二区三在线观看 | 久久久久99精品国产片 | 91黄色影视| 349k.cc看片app| 日本中文字幕影院 | 久爱综合| 女人18片毛片90分钟 | 99久久国产免费看 | 国产精品久久久久久久久久久不卡 | 奇米四色影狠狠爱7777 | 久久精品免费电影 | 国产精品一区二区在线观看 | 久久精品国产免费看久久精品 | 激情网五月 | 91综合色 | 国产 精品 资源 | 国产麻豆精品传媒av国产下载 | 97免费在线视频 | 欧美 日韩 国产 中文字幕 | 欧美日韩xxx| 欧美日韩中文另类 | 97天天综合网 | 在线电影中文字幕 | 五月天激情婷婷 | 国产成人黄色 | 天天天干天天天操 | 91九色视频观看 | 中文字幕 在线 一 二 | 9999精品| 久久精品精品 | 亚洲作爱 | 精品久久久久久久久久国产 | av韩国在线 | 成人午夜免费福利 | 91av蜜桃| 精品毛片久久久久久 | 九九热视频在线播放 | 久久免费国产精品1 | 99精品国自产在线 | 久久天天躁夜夜躁狠狠85麻豆 | 欧美成人xxxx | 精品v亚洲v欧美v高清v | 亚洲狠狠丁香婷婷综合久久久 | 中文字幕丝袜 | 岛国av在线免费 | 中文字幕a∨在线乱码免费看 | 香蕉久久久久 | 日韩精品免费一线在线观看 | 久久中文精品视频 | 日本性久久 | 国产录像在线观看 | 美女av免费看 | 色黄久久久久久 | av成人黄色 | 久草视频观看 | 四虎成人精品在永久免费 | 天天天天天天天操 | 夜夜躁狠狠燥 | 亚洲精品视频第一页 | 91av视频在线观看免费 | av免费电影网站 | 日本在线中文 | av在线免费播放网站 | 久久8精品| 日韩中文字幕第一页 | 黄色1级大片 | 激情影院在线观看 | 在线看不卡av | 成人av在线直播 | 片网站 | 久久激情视频 久久 | 手机av观看| 精品播放| 成人超碰97 | 亚洲三级毛片 | 福利一区二区 | 国产色资源 | www久久国产 | 亚洲视频 中文字幕 | 91黄色免费看 | 涩涩成人在线 | 97av精品| 日本高清中文字幕有码在线 | 免费性网站 | 97精品久久人人爽人人爽 | 亚洲三级网 | 日韩簧片在线观看 | 99在线看 | 91在线中文字幕 | 成人在线免费看视频 | 成人午夜在线电影 | 国产高清黄色 | 黄色福利网 | 99爱精品在线 | 综合色站导航 | 日韩一二区在线 | 97国产大学生情侣酒店的特点 | 亚洲综合在线一区二区三区 | 五月天激情电影 | 在线播放 一区 | 青草视频在线 | 五月天激情开心 | 美女激情影院 | 亚洲综合狠狠干 | 日韩在线视 | 久久8精品 | 免费成人在线观看 | 亚洲视频 一区 | 日韩视频在线播放 | 免费在线播放视频 | 日日夜夜天天 | 99色 | 久久久久国产精品免费网站 | av看片网| 精品久久电影 | 亚洲国产精品电影在线观看 | 24小时日本在线www免费的 | 91高清视频 | 日韩高清无线码2023 | 国产精品入口麻豆www | 国产精品免费大片视频 | 午夜黄色大片 | 粉嫩av一区二区三区四区在线观看 | 九九热视频在线免费观看 | 国产精品一区二区久久精品爱涩 | 岛国av在线 | 欧美福利视频 | 亚洲不卡av一区二区三区 | 国产中文字幕在线免费观看 | 婷婷色影院 | 午夜三级影院 | 免费日韩一区二区三区 | 午夜精品电影 | 国产小视频你懂的 | 国产一区二区视频在线 | 欧美地下肉体性派对 | 欧美激情亚洲综合 | 四虎在线免费视频 | 久久久久综合网 | 人人舔人人干 | 精品免费视频123区 午夜久久成人 | 成人免费在线观看av | 成人黄色在线 | 99视频免费播放 | 四虎欧美| 不卡的av在线 | 日日日日日 | 欧美九九九 | 国产二级视频 | 中文资源在线播放 | 成年人电影免费看 | 日韩成人免费电影 | 91麻豆视频 | www在线观看国产 | 日韩av片免费在线观看 | 成人午夜黄色影院 | 久久久久久福利 | 久久免视频 | 国产高清一 | 91九色视频网站 | 丰满少妇一级 | 色香天天 | 国内久久精品视频 | 嫩草av影院 | 国产精品美女免费 | 丁香色婷 | 97国产一区| 在线视频 你懂得 | 国产一级做a爱片久久毛片a | 色综合久久久久久久久五月 | 久久国产精品免费 | 婷婷av综合 | 玖玖玖影院| 日韩视频中文字幕在线观看 | 人人爽人人爽人人爽学生一级 | 国产区在线看 | 国产成人av片 | 国际精品久久久久 | 在线播放一区二区三区 | 香蕉在线影院 | 超碰官网| www欧美日韩 | 激情五月婷婷综合网 | 夜夜躁狠狠躁日日躁 | 偷拍福利视频一区二区三区 | 日韩三级免费 | 国产尤物一区二区三区 | 欧洲精品码一区二区三区免费看 | 91色九色| 欧美精品天堂 | 日韩网站在线看片你懂的 | 91探花系列在线播放 | 色91在线视频 | 欧美美女视频在线观看 | 中文字幕黄色网址 | 五月天亚洲精品 | 欧美精品久久久久久久亚洲调教 | 中文字幕在线观看免费 | 欧美激情精品久久久久久变态 | 国产 日韩 在线 亚洲 字幕 中文 | 人人干网 | 九九热免费视频在线观看 | 久久九九久久 | 成年人视频免费在线 | 黄色精品一区 | 久青草影院 | 日韩高清久久 | 国产精品欧美一区二区三区不卡 | 久久久资源网 | 日本久久综合视频 | 日本中文字幕高清 | 欧美一区中文字幕 | avav片 | 国产中文字幕视频 | 中文字幕久久亚洲 | 国产日韩精品一区二区在线观看播放 | 一区二区三区福利 | 国产日韩视频在线 | 久久国产欧美日韩精品 | 久久久久夜色 | 日日夜夜中文字幕 | 97超碰国产精品女人人人爽 | 91九色视频在线 | 国产99自拍 | 国产精品免费久久久 | 在线亚州 | 亚洲日本va午夜在线影院 | 久久久精品国产免费观看同学 | 国产日韩三级 | 婷婷丁香激情五月 | 狠狠狠干狠狠 | 国产精品12| 狠狠地日 | 蜜臀av夜夜澡人人爽人人 | 国产成人精品女人久久久 | 激情丁香在线 | 免费视频你懂的 | 色九九在线 | 亚洲视频电影在线 | 亚洲 成人 欧美 | 久久与婷婷| 一区二区三区在线免费观看视频 | 欧美夫妻生活视频 | 黄色亚洲 | 国产资源在线免费观看 | 一区二区三区在线观看免费 | 婷婷综合伊人 | 四虎影视国产精品免费久久 | 在线国产一区二区三区 | 亚洲高清免费在线 | 狠狠狠狠狠操 | 亚洲精品综合一区二区 | 欧美日韩国产精品一区二区三区 | av成人在线观看 | 精品亚洲视频在线 | 国产精品久久久久久久久久ktv | mm1313亚洲精品国产 | 91av手机在线观看 | 国产va饥渴难耐女保洁员在线观看 | 97视频免费观看2区 亚洲视屏 | 色噜噜噜噜 | 日韩精品视频在线观看网址 | 激情视频久久 | 三级av小说 | 久久区二区 | 久久美女高清视频 | 一级欧美日韩 | 日韩精品一区二区三区免费观看视频 | 一级一片免费观看 | 国产精品久久久免费 | 欧美精品少妇xxxxx喷水 | 最近2019年日本中文免费字幕 | 国产99精品 | 中文字幕一区二区三区在线播放 | 天天射综合 | 久久精品免费电影 | 欧美日本在线观看视频 | 一区二区精品在线观看 | 久久激情婷婷 | 亚洲视频 中文字幕 | 久久精品8 | 81国产精品久久久久久久久久 | 天天爱天天操天天爽 | 欧美激情视频在线观看免费 | 日韩免费电影网 | 日韩大片在线看 | 国产亚洲在线视频 | 91porny九色91啦中文 | 日韩综合一区二区三区 | 成人在线观看网址 | av久久久久久 | 成人a视频在线观看 | 天天拍天天色 | 日韩精品一区二区三区视频播放 | 五月婷婷一级片 | 国内小视频在线观看 | 精品伦理一区二区三区 | 一区二区电影网 | 国产黄色av | 五月婷婷色综合 | 国产精品不卡av | 国产亚洲精品美女久久 | 在线亚洲欧美视频 | 在线免费精品视频 | 国产成人精品免费在线观看 | 中文在线免费看视频 | 国产精品18久久久久久久久久久久 | 免费亚洲视频在线观看 | 91中文字幕在线播放 | 米奇四色影视 | 97av在线视频免费播放 | 色久综合 | 丁香九月婷婷 | 福利av在线| 欧美日韩视频在线观看免费 | 中文字幕在线观看网站 | 国产高清在线永久 | 亚洲国产小视频在线观看 | 欧美黄色高清 | 992tv在线| 日本中文字幕在线电影 | 免费黄色网址大全 | 99久久精品免费看国产一区二区三区 | 午夜精品久久久久久久久久 | 欧美一级性视频 | 日本中文字幕在线电影 | 在线天堂v | 久久不见久久见免费影院 | 亚洲成av人影片在线观看 | 欧美精品亚洲精品 | 成人一级在线观看 | 亚洲精品白浆高清久久久久久 | 成人一级免费电影 | av性在线| 国产精品日韩高清 | 美女国产 | 日本一区二区三区免费观看 | 日本精品视频在线观看 | 久久精品福利 | v片在线播放| 日韩在线观看av | 亚洲专区路线二 | 免费看的黄网站 | 久久国产精品一二三区 | 久久久久久久久久免费 | 久久艹在线观看 | 黄色a大片 | 久久久久国产视频 | 午夜久久视频 | 国产精品久久久久久久久久久久久久 | 亚洲国产精品女人久久久 | 日韩电影黄色 | 国产系列在线观看 | 色综合天天在线 | 国产婷婷视频在线 | www日 | 人人爽人人澡人人添人人人人 | 天天操天天摸天天爽 | 日本精品久久久久 | 永久免费的啪啪网站免费观看浪潮 | 在线激情电影 | 色姑娘综合天天 | 日本在线精品视频 | 国产伦精品一区二区三区在线 | 国产视频中文字幕 | 夜夜天天干 | 91网站观看| 五月婷婷开心 | 国内精品久久久久影院日本资源 |