📄 featurealign.cpp
字号:
///////////////////////////////////////////////////////////////////////////
//
// NAME
// FeatureAlign.h -- image registration using feature matching
//
// SEE ALSO
// FeatureAlign.h longer description
//
// Copyright ?Richard Szeliski, 2001. See Copyright.h for more details
// (modified for CSE576 Spring 2005)
//
///////////////////////////////////////////////////////////////////////////
#include "ImageLib/ImageLib.h"
#include "FeatureAlign.h"
#include <math.h>
/******************* TO DO *********************
* alignPair:
* INPUT:
* f1, f2: source feature sets
* matches: correspondences between f1 and f2
* m: motion model
* f: focal length
* nRANSAC: number of RANSAC iterations
* RANSACthresh: RANSAC distance threshold
* M: transformation matrix (output)
* OUTPUT:
* repeat for nRANSAC iterations:
* choose a minimal set of feature matches
* estimate the transformation implied by these matches
* count the number of inliers
* for the transformation with the maximum number of inliers,
* compute the least squares motion estimate using the inliers,
* and store it in M
*/
int alignPair(const FeatureSet &f1, const FeatureSet &f2,
const vector<FeatureMatch> &matches, MotionModel m, float f,
int nRANSAC, double RANSACthresh, CTransform3x3& M)
{
// BEGIN TODO
// write this entire method
// END TODO
return 0;
}
/******************* TO DO *********************
* countInliers:
* INPUT:
* f1, f2: source feature sets
* matches: correspondences between f1 and f2
* m: motion model
* f: focal length
* M: transformation matrix
* RANSACthresh: RANSAC distance threshold
* inliers: inlier feature IDs
* OUTPUT:
* transform the features in f1 by M
*
* count the number of features in f1 for which the transformed
* feature is within Euclidean distance RANSACthresh of its match
* in f2
*
* store these features IDs in inliers
*
* this method should be similar to evaluateMatch from project 1,
* except you are comparing each distance to a threshold instead
* of averaging them
*/
int countInliers(const FeatureSet &f1, const FeatureSet &f2,
const vector<FeatureMatch> &matches, MotionModel m, float f,
CTransform3x3 M, double RANSACthresh, vector<int> &inliers)
{
inliers.clear();
int count = 0;
for (unsigned int i=0; i<f1.size(); i++) {
// BEGIN TODO
// determine if the ith feature in f1, when transformed by M,
// is within RANSACthresh of its match in f2 (if one exists)
//
// if so, increment count and append i to inliers
// END TODO
}
return count;
}
/******************* TO DO *********************
* leastSquaresFit:
* INPUT:
* f1, f2: source feature sets
* matches: correspondences between f1 and f2
* m: motion model
* f: focal length
* inliers: inlier feature IDs
* M: transformation matrix (output)
* OUTPUT:
* compute the transformation from f1 to f2 using only the inliers
* and return it in M
*/
int leastSquaresFit(const FeatureSet &f1, const FeatureSet &f2,
const vector<FeatureMatch> &matches, MotionModel m, float f,
const vector<int> &inliers, CTransform3x3& M)
{
// for project 2, the transformation is a translation and
// only has two degrees of freedom
//
// therefore, we simply compute the average translation vector
// between the feature in f1 and its match in f2 for all inliers
double u = 0;
double v = 0;
for (int i=0; i<inliers.size(); i++) {
double xTrans, yTrans;
// BEGIN TODO
// compute the translation implied by the ith inlier
// and store it in (xTrans,yTrans)
// END TODO
u += xTrans;
v += yTrans;
}
u /= inliers.size();
v /= inliers.size();
M[0][0] = 1;
M[0][1] = 0;
M[0][2] = u;
M[1][0] = 0;
M[1][1] = 1;
M[1][2] = v;
M[2][0] = 0;
M[2][1] = 0;
M[2][2] = 1;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -