Adds translation model to global motion estimation
Change-Id: Ie1791ab7cfdd3f7a1b03404627246c923f1bd51f
This commit is contained in:
parent
caccf06acd
commit
9909903229
@ -45,6 +45,8 @@ inline int get_numparams(TransformationType type) {
|
||||
return 6;
|
||||
case ROTZOOM:
|
||||
return 4;
|
||||
case TRANSLATION:
|
||||
return 2;
|
||||
default:
|
||||
assert(0);
|
||||
return 0;
|
||||
@ -59,6 +61,8 @@ inline ransacType get_ransacType(TransformationType type) {
|
||||
return ransacAffine;
|
||||
case ROTZOOM:
|
||||
return ransacRotZoom;
|
||||
case TRANSLATION:
|
||||
return ransacTranslation;
|
||||
default:
|
||||
assert(0);
|
||||
return NULL;
|
||||
@ -73,6 +77,8 @@ inline projectPointsType get_projectPointsType(TransformationType type) {
|
||||
return projectPointsAffine;
|
||||
case ROTZOOM:
|
||||
return projectPointsRotZoom;
|
||||
case TRANSLATION:
|
||||
return projectPointsTranslation;
|
||||
default:
|
||||
assert(0);
|
||||
return NULL;
|
||||
|
@ -33,7 +33,8 @@ typedef enum {
|
||||
UNKNOWN_TRANSFORM = -1,
|
||||
HOMOGRAPHY, // homography, 8-parameter
|
||||
AFFINE, // affine, 6-parameter
|
||||
ROTZOOM // simplified affine with rotation and zoom only, 4-parameter
|
||||
ROTZOOM, // simplified affine with rotation and zoom only, 4-parameter
|
||||
TRANSLATION // translational motion 2-parameter
|
||||
} TransformationType;
|
||||
|
||||
inline int get_numparams(TransformationType type);
|
||||
|
@ -632,7 +632,6 @@ static void denormalizeAffine(double *H, double *T1, double *T2) {
|
||||
|
||||
static void denormalizeRotZoom(double *H, double *T1, double *T2) {
|
||||
double Ha[MAX_PARAMDIM];
|
||||
memcpy(Ha, H, 6 * sizeof(*H));
|
||||
Ha[0] = H[0];
|
||||
Ha[1] = H[1];
|
||||
Ha[2] = H[2];
|
||||
@ -648,12 +647,32 @@ static void denormalizeRotZoom(double *H, double *T1, double *T2) {
|
||||
H[3] = Ha[5];
|
||||
}
|
||||
|
||||
static void denormalizeTranslation(double *H, double *T1, double *T2) {
|
||||
double Ha[MAX_PARAMDIM];
|
||||
Ha[0] = 1;
|
||||
Ha[1] = 0;
|
||||
Ha[2] = H[0];
|
||||
Ha[3] = 0;
|
||||
Ha[4] = 1;
|
||||
Ha[5] = H[1];
|
||||
Ha[6] = Ha[7] = 0;
|
||||
Ha[8] = 1;
|
||||
denormalizeHomography(Ha, T1, T2);
|
||||
H[0] = Ha[2];
|
||||
H[1] = Ha[5];
|
||||
}
|
||||
|
||||
static int is_collinear3(double *p1, double *p2, double *p3) {
|
||||
static const double collinear_eps = 1e-3;
|
||||
const double v = (p2[0] - p1[0]) * (p3[1] - p1[1]) - (p2[1] - p1[1]) * (p3[0] - p1[0]);
|
||||
const double v = (p2[0] - p1[0]) * (p3[1] - p1[1]) -
|
||||
(p2[1] - p1[1]) * (p3[0] - p1[0]);
|
||||
return fabs(v) < collinear_eps;
|
||||
}
|
||||
|
||||
static int isDegenerateTranslation(double *p) {
|
||||
return (p[0] - p[2]) * (p[0] - p[2]) + (p[1] - p[3]) * (p[1] - p[3]) <= 2;
|
||||
}
|
||||
|
||||
static int isDegenerateAffine(double *p) {
|
||||
return is_collinear3(p, p + 2, p + 4);
|
||||
}
|
||||
@ -665,7 +684,22 @@ static int isDegenerateHomography(double *p) {
|
||||
is_collinear3(p + 2, p + 4, p + 6);
|
||||
}
|
||||
|
||||
void projectPointsRotZoom(double *mat, double *points, double *proj, const int n,
|
||||
void projectPointsTranslation(double *mat, double *points, double *proj,
|
||||
const int n,
|
||||
const int stride_points,
|
||||
const int stride_proj) {
|
||||
int i;
|
||||
for (i = 0; i < n; ++i) {
|
||||
const double x = *(points++), y = *(points++);
|
||||
*(proj++) = x + mat[0];
|
||||
*(proj++) = y + mat[1];
|
||||
points += stride_points - 2;
|
||||
proj += stride_proj - 2;
|
||||
}
|
||||
}
|
||||
|
||||
void projectPointsRotZoom(double *mat, double *points,
|
||||
double *proj, const int n,
|
||||
const int stride_points, const int stride_proj) {
|
||||
int i;
|
||||
for (i = 0; i < n; ++i) {
|
||||
@ -677,7 +711,8 @@ void projectPointsRotZoom(double *mat, double *points, double *proj, const int n
|
||||
}
|
||||
}
|
||||
|
||||
void projectPointsAffine(double *mat, double *points, double *proj, const int n,
|
||||
void projectPointsAffine(double *mat, double *points,
|
||||
double *proj, const int n,
|
||||
const int stride_points, const int stride_proj) {
|
||||
int i;
|
||||
for (i = 0; i < n; ++i) {
|
||||
@ -689,7 +724,8 @@ void projectPointsAffine(double *mat, double *points, double *proj, const int n,
|
||||
}
|
||||
}
|
||||
|
||||
void projectPointsHomography(double *mat, double *points, double *proj, const int n,
|
||||
void projectPointsHomography(double *mat, double *points,
|
||||
double *proj, const int n,
|
||||
const int stride_points, const int stride_proj) {
|
||||
int i;
|
||||
double x, y, Z;
|
||||
@ -703,6 +739,33 @@ void projectPointsHomography(double *mat, double *points, double *proj, const in
|
||||
}
|
||||
}
|
||||
|
||||
int findTranslation(const int np, double *pts1, double *pts2, double *mat) {
|
||||
const int np2 = np * 2;
|
||||
int i;
|
||||
double sx, sy, dx, dy;
|
||||
double sumx, sumy;
|
||||
|
||||
double T1[9], T2[9];
|
||||
normalizeHomography(pts1, np, T1);
|
||||
normalizeHomography(pts2, np, T2);
|
||||
|
||||
sumx = 0;
|
||||
sumy = 0;
|
||||
for (i = 0; i < np; ++i) {
|
||||
dx = *(pts2++);
|
||||
dy = *(pts2++);
|
||||
sx = *(pts1++);
|
||||
sy = *(pts1++);
|
||||
|
||||
sumx += dx - sx;
|
||||
sumy += dy - sy;
|
||||
}
|
||||
mat[0] = sumx / np;
|
||||
mat[1] = sumy / np;
|
||||
denormalizeTranslation(mat, T1, T2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int findRotZoom(const int np, double *pts1, double *pts2, double *mat) {
|
||||
const int np2 = np * 2;
|
||||
double *a = (double *)malloc(sizeof(double) * np2 * 9);
|
||||
@ -849,9 +912,10 @@ int findHomography(const int np, double *pts1, double *pts2, double *mat) {
|
||||
|
||||
for (i = 0; i < 9; i++) mat[i] = V[i * 9 + mini];
|
||||
denormalizeHomography(mat, T1, T2);
|
||||
// if (mat[8] == 0.0) return 1;
|
||||
// for (i = 0; i < 9; i++) mat[i] /= mat[8];
|
||||
free(a);
|
||||
if (mat[8] == 0.0) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -899,6 +963,23 @@ int findHomographyScale1(const int np, double *pts1, double *pts2,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ransacTranslation(double *matched_points, int npoints,
|
||||
int *number_of_inliers,
|
||||
int *best_inlier_mask, double *bestH) {
|
||||
return ransac_(matched_points,
|
||||
npoints,
|
||||
number_of_inliers,
|
||||
best_inlier_mask,
|
||||
bestH,
|
||||
2,
|
||||
2,
|
||||
isDegenerateTranslation,
|
||||
NULL, // normalizeHomography,
|
||||
NULL, // denormalizeRotZoom,
|
||||
findTranslation,
|
||||
projectPointsTranslation);
|
||||
}
|
||||
|
||||
int ransacRotZoom(double *matched_points, int npoints,
|
||||
int *number_of_inliers,
|
||||
int *best_inlier_mask, double *bestH) {
|
||||
@ -936,16 +1017,26 @@ int ransacAffine(double *matched_points, int npoints,
|
||||
int ransacHomography(double *matched_points, int npoints,
|
||||
int *number_of_inliers,
|
||||
int *best_inlier_mask, double *bestH) {
|
||||
return ransac_(matched_points,
|
||||
npoints,
|
||||
number_of_inliers,
|
||||
best_inlier_mask,
|
||||
bestH,
|
||||
4,
|
||||
8,
|
||||
isDegenerateHomography,
|
||||
NULL, // normalizeHomography,
|
||||
NULL, // denormalizeHomography,
|
||||
findHomography,
|
||||
projectPointsHomography);
|
||||
int result =
|
||||
ransac_(matched_points,
|
||||
npoints,
|
||||
number_of_inliers,
|
||||
best_inlier_mask,
|
||||
bestH,
|
||||
4,
|
||||
8,
|
||||
isDegenerateHomography,
|
||||
NULL, // normalizeHomography,
|
||||
NULL, // denormalizeHomography,
|
||||
findHomography,
|
||||
projectPointsHomography);
|
||||
if (!result) {
|
||||
// normalize so that H33 = 1
|
||||
int i;
|
||||
double m = 1.0 / bestH[8];
|
||||
for (i = 0; i < 8; ++i)
|
||||
bestH[i] *= m;
|
||||
bestH[8] = 1.0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -32,12 +32,21 @@ int ransacAffine(double *matched_points, int npoints,
|
||||
int ransacRotZoom(double *matched_points, int npoints,
|
||||
int *number_of_inliers, int *best_inlier_indices,
|
||||
double *bestH);
|
||||
int ransacTranslation(double *matched_points, int npoints,
|
||||
int *number_of_inliers, int *best_inlier_indices,
|
||||
double *bestH);
|
||||
|
||||
void projectPointsHomography(double *mat, double *points, double *proj,
|
||||
const int n, const int stride_points, const int stride_proj);
|
||||
const int n, const int stride_points,
|
||||
const int stride_proj);
|
||||
void projectPointsAffine(double *mat, double *points, double *proj,
|
||||
const int n, const int stride_points, const int stride_proj);
|
||||
const int n, const int stride_points,
|
||||
const int stride_proj);
|
||||
void projectPointsRotZoom(double *mat, double *points, double *proj,
|
||||
const int n, const int stride_points, const int stride_proj);
|
||||
const int n, const int stride_points,
|
||||
const int stride_proj);
|
||||
void projectPointsTranslation(double *mat, double *points, double *proj,
|
||||
const int n, const int stride_points,
|
||||
const int stride_proj);
|
||||
|
||||
#endif // VP9_ENCODER_VP9_RANSAC_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user