尝试运行示例:Ceres BA (使用BAL数据集)
所有文件CMakeLists.txt//#指定要求最小的cmake版本,如果版本小于该要求,程序终止cmake_minimum_required(VERSION 3.13)//#项目名称project(CeresBA)//#用变量替换值set(CMAKE_CXX_STANDARD 14)//#列表操作(读、搜索、修改、排序)//#追加例子:LIST(APPEND CMAKE_MODULE_PATH
·
所有文件
CMakeLists.txt
//#指定要求最小的cmake版本,如果版本小于该要求,程序终止
cmake_minimum_required(VERSION 3.13)
//#项目名称
project(CeresBA)
//#用变量替换值
set(CMAKE_CXX_STANDARD 14)
//#列表操作(读、搜索、修改、排序)
//#追加例子:LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
list(APPEND CMAKE_MODULE_PATH ${CeresBA_SOURCE_DIR}/cmake)
//#搜索外部库
find_package(Ceres REQUIRED)
//#指定头文件的搜索路径,编译器查找相应文件
include_directories(${CERES_INCLUDE_DIRS})
//#将指定的源文件生成链接库文件
//#源文件:common.cpp 链接库文件:bal_common
add_library(bal_common common.cpp)
//#用指定的源文件为工程添加可执行文件
add_executable(CeresBA bundle_adjustment_ceres.cpp SnavelyReprojectionError.h rotation.h)
//#链接Ceres库到项目上
target_link_libraries(CeresBA ${CERES_LIBRARIES} bal_common)
bundle_adjustment_ceres.cpp
#include <iostream>
#include <ceres/ceres.h>
#include "common.h"
#include "SnavelyReprojectionError.h"
using namespace std;
void SolveBA(BALProblem &bal_problem);
int main(int argc, char **argv) {
if (argc != 2) {
cout << "usage: bundle_adjustment_ceres bal_data.txt" << endl;
return 1;
}
BALProblem bal_problem(argv[1]);
bal_problem.Normalize();
bal_problem.Perturb(0.1, 0.5, 0.5);
bal_problem.WriteToPLYFile("initial.ply");
SolveBA(bal_problem);
bal_problem.WriteToPLYFile("final.ply");
return 0;
}
void SolveBA(BALProblem &bal_problem) {
const int point_block_size = bal_problem.point_block_size();
const int camera_block_size = bal_problem.camera_block_size();
double *points = bal_problem.mutable_points();
double *cameras = bal_problem.mutable_cameras();
// Observations is 2 * num_observations long array observations
// [u_1, u_2, ... u_n], where each u_i is two dimensional, the x
// and y position of the observation.
const double *observations = bal_problem.observations();
ceres::Problem problem;
for (int i = 0; i < bal_problem.num_observations(); ++i) {
ceres::CostFunction *cost_function;
// Each Residual block takes a point and a camera as input
// and outputs a 2 dimensional Residual
cost_function = SnavelyReprojectionError::Create(observations[2 * i + 0], observations[2 * i + 1]);
// If enabled use Huber's loss function.
ceres::LossFunction *loss_function = new ceres::HuberLoss(1.0);
// Each observation corresponds to a pair of a camera and a point
// which are identified by camera_index()[i] and point_index()[i]
// respectively.
double *camera = cameras + camera_block_size * bal_problem.camera_index()[i];
double *point = points + point_block_size * bal_problem.point_index()[i];
problem.AddResidualBlock(cost_function, loss_function, camera, point);
}
// show some information here ...
std::cout << "bal problem file loaded..." << std::endl;
std::cout << "bal problem have " << bal_problem.num_cameras() << " cameras and "
<< bal_problem.num_points() << " points. " << std::endl;
std::cout << "Forming " << bal_problem.num_observations() << " observations. " << std::endl;
std::cout << "Solving ceres BA ... " << endl;
ceres::Solver::Options options;
options.linear_solver_type = ceres::LinearSolverType::SPARSE_SCHUR;
options.minimizer_progress_to_stdout = true;
ceres::Solver::Summary summary;
ceres::Solve(options, &problem, &summary);
std::cout << summary.FullReport() << "\n";
}
在IDE终端运行
(工作路径: ~/Projects/CLionProjects/CeresBA)
mkdir build
cd build
cmake ..
make
cd ..
./build/CeresBA problem-16-22106-pre.txt
Result
使用MeshLab软件打开程序生成的两个文件
initial.ply final.ply
initial.ply
final.ply

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)