// Copyright 2019 The MediaPipe Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Motion models, that are supported and estimated by MotionStabilization.
// Note, that transformations represent the motion of the
// feature points from the previous frame to the current one.
// Note that the actual camera movement, is the inverse of this
// transformation.
// Check carefully, which movement (feature or camera) is required.
// Note that for each model the default values always specify an identity
// transform. Follow this rule when adding new models.
syntax = "proto2";
package mediapipe;
// Here x represents a 2D point in the image plane, in the following
// coordinate system:
// *----> x
// |
// |
// v y
// Simple translational model:
// I * x + [dx; dy] with I being 2x2 identity transform.
message TranslationModel {
optional float dx = 1 [default = 0];
optional float dy = 2 [default = 0];
}
// Non-linear similarity model (w.r.t. to its parametrization).
// c_r := cos(rotation);
// s_r := sin(rotation);
// Transformation applied to x:
// [scale 0; * [c_r -s_r; * x + [dx;
// 0 scale] s_r c_r] dy]
message SimilarityModel {
optional float dx = 1 [default = 0];
optional float dy = 2 [default = 0];
optional float scale = 3 [default = 1];
optional float rotation = 4 [default = 0]; // angle in [-pi, pi].
}
// Linear similarity model:
// [a -b; * x + [dx;
// b a] dy]
message LinearSimilarityModel {
optional float dx = 1 [default = 0];
optional float dy = 2 [default = 0];
optional float a = 3 [default = 1];
optional float b = 4 [default = 0];
}
// Affine according to
// ( [a b * x + [dx;
// ( c d] dy]
message AffineModel {
optional float dx = 1 [default = 0];
optional float dy = 2 [default = 0];
optional float a = 3 [default = 1];
optional float b = 4 [default = 0];
optional float c = 5 [default = 0];
optional float d = 6 [default = 1];
}
// Homography according to
// [h_00 h_01 h_02;
// h_10 h_11 h_12;
// h_20 h_21 1];
// Note: The parametrization with h_22 = 1 does not always hold, e.g.
// if the origin (0, 0, 1) gets mapped to the line at infinity
// (0, 0, 1). However for video we expect small perspective
// changes between frames and this parametrization improves
// robustness greatly as it removes an additional DOF.
// Therefore, all methods in motion_stabilization should not be
// used for general wide-baseline matching of frames.
message Homography {
optional float h_00 = 1 [default = 1];
optional float h_01 = 2 [default = 0];
optional float h_02 = 3 [default = 0];
optional float h_10 = 4 [default = 0];
optional float h_11 = 5 [default = 1];
optional float h_12 = 6 [default = 0];
optional float h_20 = 7 [default = 0];
optional float h_21 = 8 [default = 0];
}
// Mixture models with higher degrees of freedom, according to
// \sum_i model(i) * weight(i), where weights are passed during transform and
// are expected to sum to one.
message MixtureLinearSimilarity {
repeated LinearSimilarityModel model = 1;
}
message MixtureAffine {
repeated AffineModel model = 1;
}
message MixtureHomography {
repeated Homography model = 1;
// Specifies which degree of freedom vary across mixture.
// Can be used to implement several transformation functions quicker.
enum VariableDOF {
ALL_DOF = 0; // All dof are variable.
TRANSLATION_DOF = 1; // Only translation (h_02, h_12) varies.
SKEW_ROTATION_DOF = 2; // Translation (h_02, h_12), and skew-rotation
// (h_01, h_10) vary.
CONST_DOF = 3; // Mixture is constant.
}
optional VariableDOF dof = 2 [default = ALL_DOF];
}