Win10 + VS2017 + Ceres配置

【前言】

Ceres是google出品的一款基於C++的開源非線性優化庫。官方文檔:Ceres官方文檔地址

【依賴庫】

Eigen - 官網
glog - github
gflags - github
Ceres - github

【配置過程】

1.Eigen

Eigen是由.h文件構成的一款支持矩陣運算的數學計算庫,因此不需要額外編譯,僅解壓縮後得到源碼文件即可。

2.glog

解壓得到源碼文件glog-master後,在同級目錄下建立glog_build文件夾,用來放置編譯後的文件。打開CMAKE客戶端,對應選擇源碼文件路徑和編譯文件路徑,如下圖所示。
在這裏插入圖片描述
然後就可以通過Configure按鈕選擇配置屬性,我們這裏選擇VS2017的Win64,如圖。
在這裏插入圖片描述
之後點擊Finish就可以觸發Cmake進行配置,配置表單會有一些標紅的項目,此時需要注意一點:BUILD_SHARED_LIBS選項需要勾選,用來生成dll文件,如圖。
在這裏插入圖片描述
若沒有這個項目,可以通過Add Entry來手動添加。
之後再次觸發Configure,直到沒有紅色錯誤爲止;再觸發Generate按鈕,如下提示則表示CMake順利結束。
在這裏插入圖片描述
然後在glog_build文件夾下打開glog.sln文件,分別在Release x64和Debug x64模式下重新生成ALL_BUILD。

3.gflags

與glog一致,建立gflags_build文件夾,存放編譯後的文件。Cmake的配置方式也與之前相同。再次提示一點BUILD_SHARED_LIBS選項需要勾選,用來生成dll文件。打開生成的gflags.sln文件,分別在Release x64和Debug x64模式下重新生成ALL_BUILD。

4.Ceres

與前面兩個配置方案一致,建立ceres_build文件夾,存放編譯後的文件。Cmake的時候也要注意,BUILD_SHARED_LIBS選項需要勾選,用來生成dll文件。打開生成的Ceres.sln文件,分別在Release x64和Debug x64模式下重新生成ALL_BUILD。

5.包含文件和鏈接庫整理

新建include文件夾和lib文件夾,分別存放包含文件和引用庫,方便後面VS配置使用。需要說明的是,這一步不是必須的,只是把分散在各處的相關文件聚集在同一個公共位置而已。
include內放置如下文件:

.\eigen-3.3.7\Eigen
.\glog_build\glog
.\glog-master\src\glog
.\gflags_build\include\gflags
.\ceres-solver-1.14.0\include\ceres

lib內存放如下文件:

.\glog_build\Debug\glogd.dll
.\glog_build\Debug\glogd.lib
.\glog_build\Release\glog.dll
.\glog_build\Release\glog.lib
.\gflags_build\bin\Debug\gflags_debug.dll
.\gflags_build\lib\Debug\gflags_debug.lib
.\gflags_build\bin\Release\gflags.dll
.\gflags_build\lib\Release\gflags.lib
.\ceres-solver_build\bin\Debug\ceres-debug.dll
.\ceres-solver_build\lib\Debug\ceres-debug.lib
.\ceres-solver_build\bin\Release\ceres.dll
.\ceres-solver_build\lib\Release\ceres.lib

6.VS配置

新建一個VS工程,屬性配置如下(Debug與Release類似)。
配置屬性 --> VC++目錄 --> 包含目錄:.\include;(上一步中的include文件)
配置屬性 --> VC++目錄 --> 庫目錄:.\lib;(上一步中的lib文件)
配置屬性 --> 鏈接器 --> 輸入 --> 附加依賴項:

ceres.lib
ceres-debug.lib
glog.lib
glogd.lib
gflags.lib
gflags_debug.lib

7.測試代碼

#include<iostream>
#include<ceres/ceres.h>

//第一部分:構建代價函數,重載()符號,仿函數的小技巧
struct CostFunctor {
	template <typename T>
	bool operator()(const T* const x, T* residual) const {
		//residual[0] = T(10.0) - x[0];
		residual[0] = (T(10.0) - x[0])*(T(10.0) - x[0])*T(0.5);
		return true;
	}
};

//主函數
int main() {
	//google::InitGoogleLogging(argv[0]);

	// 尋優參數x的初始值,爲5
	double initial_x = 5.0;
	double x = initial_x;

	// 第二部分:構建尋優問題
	ceres::Problem problem;
	ceres::CostFunction* cost_function =
		new ceres::AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor); //使用自動求導,將之前的代價函數結構體傳入,第一個1是輸出維度,即殘差的維度,第二個1是輸入維度,即待尋優參數x的維度。
	problem.AddResidualBlock(cost_function, NULL, &x); //向問題中添加誤差項,本問題比較簡單,添加一個就行。

	//第三部分: 配置並運行求解器
	ceres::Solver::Options options;
	options.linear_solver_type = ceres::DENSE_QR; //配置增量方程的解法
	options.minimizer_progress_to_stdout = true;//輸出到cout
	ceres::Solver::Summary summary;//優化信息
	ceres::Solve(options, &problem, &summary);//求解!!!

	std::cout << summary.BriefReport() << std::endl;//輸出優化的簡要信息
    //最終結果
	std::cout << "x : " << initial_x
		<< " -> " << x << std::endl;
	system("pause");
	return 0;
}

運行結果如下:在這裏插入圖片描述

相關參考

參考1參考2參考3參考4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章