ceres想要固定一个参数块和想要固定参数块中的一部分参数的调用方法
void addExtrinsicsToProblem(const sfmData::SfMData& sfmData,
BundleAdjustment::ERefineOptions refineOptions,
ceres::Problem& problem)
{
const bool refineTranslation = refineOptions & BundleAdjustment::REFINE_TRANSLATION;
const bool refineRotation = refineOptions & BundleAdjustment::REFINE_ROTATION;
const auto addPose = [&](const sfmData::CameraPose& cameraPose, bool isConstant, std::array<double, 6>& poseBlock) {
const Mat3& R = cameraPose.getTransform().rotation();
const Vec3& t = cameraPose.getTransform().translation();
double angleAxis[3];
ceres::RotationMatrixToAngleAxis(static_cast<const double*>(R.data()), angleAxis);
poseBlock.at(0) = angleAxis[0];
poseBlock.at(1) = angleAxis[1];
poseBlock.at(2) = angleAxis[2];
poseBlock.at(3) = t(0);
poseBlock.at(4) = t(1);
poseBlock.at(5) = t(2);
double* poseBlockPtr = poseBlock.data();
problem.AddParameterBlock(poseBlockPtr, 6);
// add pose parameter to the all parameters blocks pointers list
_allParametersBlocks.push_back(poseBlockPtr);
// keep the camera extrinsics constants
if (cameraPose.isLocked() || isConstant || (!refineTranslation && !refineRotation))
{
// set the whole parameter block as constant.
_statistics.addState(EParameter::POSE, EEstimatorParameterState::CONSTANT);
problem.SetParameterBlockConstant(poseBlockPtr);
return;
}
// constant parameters
std::vector<int> constantExtrinsic;
// don't refine rotations
if (!refineRotation)
{
constantExtrinsic.push_back(0);
constantExtrinsic.push_back(1);
constantExtrinsic.push_back(2);
}
// don't refine translations
if (!refineTranslation)
{
constantExtrinsic.push_back(3);
constantExtrinsic.push_back(4);
constantExtrinsic.push_back(5);
}
// subset parametrization
if (!constantExtrinsic.empty())
{
auto* subsetManifold = new ceres::SubsetManifold(6, constantExtrinsic);
problem.SetManifold(poseBlockPtr, subsetManifold);
}
_statistics.addState(EParameter::POSE, EEstimatorParameterState::REFINED);
};