2 * CompactModelBase.icpp
4 * Created on: Aug 19, 2019
8 namespace ModelFitting {
10 template<typename ImageType>
11 CompactModelBase<ImageType>::CompactModelBase(
12 std::shared_ptr<BasicParameter> x_scale, std::shared_ptr<BasicParameter> y_scale,
13 std::shared_ptr<BasicParameter> rotation, double width, double height,
14 std::shared_ptr<BasicParameter> x, std::shared_ptr<BasicParameter> y,
15 std::tuple<double, double, double, double> transform)
16 : ExtendedModel<ImageType>({}, x_scale, y_scale, rotation, width, height, x, y),
17 m_x_scale(x_scale), m_y_scale(y_scale), m_rotation(rotation)
19 m_jacobian = Mat22(transform).GetTranspose();
20 m_inv_jacobian = m_jacobian.GetInverse();
23 template<typename ImageType>
24 Mat22 CompactModelBase<ImageType>::getCombinedTransform(double pixel_scale) const {
27 sincos(m_rotation->getValue(), &s, &c);
29 s = sin(m_rotation->getValue());
30 c = cos(m_rotation->getValue());
38 1. / m_x_scale->getValue(), 0.0,
39 0.0, 1. / m_y_scale->getValue());
41 return scale * rotation * m_inv_jacobian * pixel_scale;
44 template<typename ImageType>
45 template<typename ModelEvaluator>
46 inline float CompactModelBase<ImageType>::samplePixel(const ModelEvaluator& model_eval, int x, int y, unsigned int subsampling) const {
48 for (std::size_t ix=0; ix<subsampling; ++ix) {
49 float x_model = (x - 0.5 + (ix+1) * 1.0 / (subsampling+1));
50 for (std::size_t iy=0; iy<subsampling; ++iy) {
51 float y_model = (y - 0.5 + (iy+1) * 1.0 / (subsampling+1));
52 acc += model_eval.evaluateModel(x_model, y_model);
56 return acc / (subsampling*subsampling);
59 template<typename ImageType>
60 template<typename ModelEvaluator>
61 inline float CompactModelBase<ImageType>::adaptiveSamplePixel(const ModelEvaluator& model_eval, int x, int y, unsigned int max_subsampling, float threshold) const {
62 float value = samplePixel(model_eval, x,y, 1);
63 for (unsigned int i=2; i<=max_subsampling; i+=2) {
64 float newValue = samplePixel(model_eval, x,y, i);
65 float ratio = newValue / value;
66 if (ratio < threshold && ratio > 1.0 / threshold) {