ORB_SLAM2在win10中封装为.dll,实现小觅实时运行双目模式、罗技摄像头单目AR模式(1)

1. ORB_SLAM2在Win10平台的封装

参考

ORB-SLAM2应用练习:三维重建系统搭建 (1)

1.1 更改 ORB_SLAM2项目->属性->常规->WindowsSDK版本为当前VS使用的版本;依次设置配置类型为动态库.dll和静态库.lib,设置编译模式为Release X64,点击生成->编译,生成对应的库文件。

1.2 新建工程,命名为3DRestruct,新建文件夹3rd,3rd/lib,3rd/include,将生成的.lib和.dll放在3rd/lib下,将SLAM.h放在3rd/include下。

1.3 点击视图->其他窗口->属性管理器,右键点击Release|x64->添加现有属性表,添加ORB_SLAM2依赖库。点击依赖库的属性,修改VC++目录中的包含目录和库目录。

1.4 右键项目->属性->VC++目录->包含目录,添加./3rd/include;当前对话窗口->链接器->输入->附加依赖项,添加./3rd/lib/ORB-SLAM.lib;项目->属性->调试->环境,输入

path=xxx/DBoW2/lib/;xxx/g2o/lib/;xxx/Pangolin/lib/;xxx/OpenCV3_1/opencv/build/x64/vc14/bin/;$(ProjectDir)/3rd/lib/;

尤其是最后的$(ProjectDir)/3rd/lib/;,是用来配置ORB-SLAM2动态库的路径。

1.5 编译模式为Release|x64,创建main.cpp(其实就是稍微改动了ORB-SLAM2/Example/stereo/kitti_stereo.cc),需要具备KITTI/xx数据。

#include <SLAM.h>
#include<chrono>
#include<windows.h>
#include<fstream>
#include<iomanip>
using namespace std;
void LoadImages(const string &strPathToSequence, vector<string> &vstrImageLeft,
	vector<string> &vstrImageRight, vector<double> &vTimestamps);

int main()
{
	// Retrieve paths to images
	vector<string> vstrImageLeft;
	vector<string> vstrImageRight;
	vector<double> vTimestamps;
	LoadImages("C:/Users/zhang/Desktop/03", vstrImageLeft, vstrImageRight, vTimestamps);

	const int nImages = vstrImageLeft.size();

	// Create SLAM system. It initializes all system threads and gets ready to process frames.	
	slam.init("C:/Users/zhang/Desktop/try/ORB-SLAM2-2/ORB-SLAM2/Run/Vocabulary/ORBvoc.txt", "C:/Users/zhang/Desktop/try/ORB-SLAM2-2/ORB-SLAM2/Run/Setting/KITTI03.yaml", SLAM::eSensor::STEREO);

	// Vector for tracking time statistics
	vector<float> vTimesTrack;
	vTimesTrack.resize(nImages);

	cout << endl << "-------" << endl;
	cout << "Start processing sequence ..." << endl;
	cout << "Images in the sequence: " << nImages << endl << endl;

	// Main loop
	cv::Mat imLeft, imRight;
	for (int ni = 0; ni < nImages; ni++)
	{
		// Read left and right images from file
		imLeft = cv::imread(vstrImageLeft[ni], CV_LOAD_IMAGE_UNCHANGED);
		imRight = cv::imread(vstrImageRight[ni], CV_LOAD_IMAGE_UNCHANGED);
		double tframe = vTimestamps[ni];

		if (imLeft.empty())
		{
			cerr << endl << "Failed to load image at: "
				<< string(vstrImageLeft[ni]) << endl;
			return 1;
		}

		std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
		
		slam.track(imLeft, imRight);

		std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();

		double ttrack = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1).count();

		vTimesTrack[ni] = ttrack;

		// Wait to load the next frame
		double T = 0;
		if (ni < nImages - 1)
			T = vTimestamps[ni + 1] - tframe;
		else if (ni > 0)
			T = tframe - vTimestamps[ni - 1];

		if (ttrack < T)
			Sleep((T - ttrack)*1e3);  //Linux下#include<unistd.h>调用Usleep为微秒,Win10下#include<windows.h>调用Sleep为毫秒。
	}

	// Stop all threads即调用SLAM库中的析构函数,不用显示调用

	// Tracking time statistics
	sort(vTimesTrack.begin(), vTimesTrack.end());
	float totaltime = 0;
	for (int ni = 0; ni < nImages; ni++)
	{
		totaltime += vTimesTrack[ni];
	}
	cout << "-------" << endl << endl;
	cout << "median tracking time: " << vTimesTrack[nImages / 2] << endl;
	cout << "mean tracking time: " << totaltime / nImages << endl;

	return 0;
}

void LoadImages(const string &strPathToSequence, vector<string> &vstrImageLeft,
	vector<string> &vstrImageRight, vector<double> &vTimestamps)
{
	ifstream fTimes;
	string strPathTimeFile = strPathToSequence + "/times.txt";
	fTimes.open(strPathTimeFile.c_str());
	while (!fTimes.eof())
	{
		string s;
		getline(fTimes, s);
		if (!s.empty())
		{
			stringstream ss;
			ss << s;
			double t;
			ss >> t;
			vTimestamps.push_back(t);
		}
	}

	string strPrefixLeft = strPathToSequence + "/image_0/";
	string strPrefixRight = strPathToSequence + "/image_1/";

	const int nTimes = vTimestamps.size();
	vstrImageLeft.resize(nTimes);
	vstrImageRight.resize(nTimes);

	for (int i = 0; i < nTimes; i++)
	{
		stringstream ss;
		ss << setfill('0') << setw(6) << i;
		vstrImageLeft[i] = strPrefixLeft + ss.str() + ".png";
		vstrImageRight[i] = strPrefixRight + ss.str() + ".png";
	}
}

点击运行,就可以观察到数据库离线跑ORB_SLAM的界面啦!如果不行,报错缺少某个依赖库,就把该.dll放到项目的生成目录下即可。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ORB-SLAM2是一种广泛使用的视觉定位和地图构建算法,能够在实时环境下使用单目双目和RGB-D相机进行定位和三维地图构建。在本文,我们将讨论如何使用Intel Realsense D435i相机进行ORB-SLAM2实时定位与地图构建。 首先,Intel Realsense D435i相机是一种结构光相机,可以提供RGB和深度图像。通过该相机提供的深度图像,ORB-SLAM2算法可以计算出相机的运动以及环境的特征点,并构建出三维地图。 在使用ORB-SLAM2前,我们需要安装OpenCV、Pangolin和其他一些依赖库,并将ORB-SLAM2代码编译为可执行文件。 通过运行ORB-SLAM2程序时,需要选择所使用的相机类型,在这里我们选择Intel Realsense D435i相机。然后,我们通过代码配置相机参数,如分辨率、深度图像的合理范围等。 接下来,我们可以选择使用单目双目或RGB-D模式进行定位和地图构建。对于单目模式,我们只使用相机的RGB图像,并通过ORB-SLAM2算法实时定位和地图构建。对于双目和RGB-D模式,我们需要同时使用相机的RGB图像和深度图像,并通过计算立体匹配或深度图像对齐来获得更准确的定位和地图构建结果。 最后,ORB-SLAM2会实时计算相机的运动,并在地图添加新的特征点和关键帧。通过地图和关键帧的维护,我们可以实现相机的实时定位,即使在没有先前观察到的场景。 总之,通过使用Intel Realsense D435i相机和ORB-SLAM2算法,我们可以实时运行单目双目和RGB-D模式下的定位和地图构建。这种能力在许多应用都是非常有用的,如机器人导航、增强现实等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值