camenduru's picture
ceres-solver and colmap
7b7496d
// Copyright (c) 2022, ETH Zurich and UNC Chapel Hill.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de)
#include "feature/types.h"
#include "util/logging.h"
namespace colmap {
FeatureKeypoint::FeatureKeypoint() : FeatureKeypoint(0, 0) {}
FeatureKeypoint::FeatureKeypoint(const float x, const float y)
: FeatureKeypoint(x, y, 1, 0, 0, 1) {}
FeatureKeypoint::FeatureKeypoint(const float x_, const float y_,
const float scale, const float orientation)
: x(x_), y(y_) {
CHECK_GE(scale, 0.0);
const float scale_cos_orientation = scale * std::cos(orientation);
const float scale_sin_orientation = scale * std::sin(orientation);
a11 = scale_cos_orientation;
a12 = -scale_sin_orientation;
a21 = scale_sin_orientation;
a22 = scale_cos_orientation;
}
FeatureKeypoint::FeatureKeypoint(const float x_, const float y_,
const float a11_, const float a12_,
const float a21_, const float a22_)
: x(x_), y(y_), a11(a11_), a12(a12_), a21(a21_), a22(a22_) {}
FeatureKeypoint FeatureKeypoint::FromParameters(const float x, const float y,
const float scale_x,
const float scale_y,
const float orientation,
const float shear) {
return FeatureKeypoint(x, y, scale_x * std::cos(orientation),
-scale_y * std::sin(orientation + shear),
scale_x * std::sin(orientation),
scale_y * std::cos(orientation + shear));
}
void FeatureKeypoint::Rescale(const float scale) { Rescale(scale, scale); }
void FeatureKeypoint::Rescale(const float scale_x, const float scale_y) {
CHECK_GT(scale_x, 0);
CHECK_GT(scale_y, 0);
x *= scale_x;
y *= scale_y;
a11 *= scale_x;
a12 *= scale_y;
a21 *= scale_x;
a22 *= scale_y;
}
float FeatureKeypoint::ComputeScale() const {
return (ComputeScaleX() + ComputeScaleY()) / 2.0f;
}
float FeatureKeypoint::ComputeScaleX() const {
return std::sqrt(a11 * a11 + a21 * a21);
}
float FeatureKeypoint::ComputeScaleY() const {
return std::sqrt(a12 * a12 + a22 * a22);
}
float FeatureKeypoint::ComputeOrientation() const {
return std::atan2(a21, a11);
}
float FeatureKeypoint::ComputeShear() const {
return std::atan2(-a12, a22) - ComputeOrientation();
}
} // namespace colmap