我需要知道这个算法是否已知:
void getMatches(IpVec &ipts1, IpVec &ipts2, IpPairVec &matches, float ratio) {
float dist, d1, d2;
Ipoint *match;
matches.clear();
for (unsigned int i = 0; i < ipts1.size(); i++) {
d1 = d2 = FLT_MAX;
for (unsigned int j = 0; j < ipts2.size(); j++) {
dist = ipts1[i] - ipts2[j];
if (dist < d1) // if this feature matches better than current best
{
d2 = d1;
d1 = dist;
match = &ipts2[j];
} else if (dist < d2) // this feature matches better than second best
{
d2 = dist;
}
}
// If match has a d1:d2 ratio < 0.65 ipoints are a match
if (d1 / d2 < ratio) {
// Store the change in position
ipts1[i].dx = match->x - ipts1[i].x;
ipts1[i].dy = match->y - ipts1[i].y;
matches.push_back(std::make_pair(ipts1[i], *match));
}
}
}
class Ipoint {
public:
//! Destructor
~Ipoint() {
};
//! Constructor
Ipoint() : orientation(0) {
};
//! Gets the distance in descriptor space between Ipoints
float operator-(const Ipoint &rhs) {
float sum = 0.f;
for (int i = 0; i < 64; ++i) {
//std::cout << i << "\n";
try {
sum += (this->descriptor[i] - rhs.descriptor[i])*(this->descriptor[i] - rhs.descriptor[i]);
} catch (char *str) {
std::cout << "Caught some other exception: " << str << "\n";
}
}
return sqrt(sum);
};
//! Coordinates of the detected interest point
float x, y;
//! Detected scale
float scale;
//! Orientation measured anti-clockwise from +ve x-axis
float orientation;
//! Sign of laplacian for fast matching purposes
int laplacian;
//! Vector of descriptor components
float descriptor[64];
//! Placeholds for point motion (can be used for frame to frame motion analysis)
float dx, dy;
//! Used to store cluster index
int clusterIndex;
};
这比较了SURF算法的结果。
答案 0 :(得分:4)
你问了很多问题,我认为我不能回答所有这些问题,但这里尽可能回答你的问题。
这绝对是最近邻算法,其目标是找到第一个向量中每个点的两个最近点,然后检查它们的距离比是否小于某个截止值。
您可以使用四叉树或kd树执行此操作,但由于您的点都是一维值,因此您可以使用平衡二叉搜索树做得更好。给定这样一棵树,如果你通过节点线程化一个链表,你可以通过在二叉搜索树中查找最接近的元素p找到k个最近邻居到某个测试点p,然后遍历各个步骤(k + 1)方向并取你所发现的k个最近点。这在时间O(lg n + k)中运行,其中n是点数,k如上所述。这比现在的效率要高得多,每次查找需要O(n)次。
如果特征向量的维度大于1但小于20,那么使用kd树将是一个非常有效的度量。
对于更高的维度,您可能希望在应用kd树之前使用PCA减少维数,或者使用更具伸缩性的ANN结构,例如局部敏感的散列。
SURF最适合场景和物体检测。如果您需要确定两个图像是否相同,那么使用全局描述符算法(例如GIST)可以做得更好。使用全局描述符的优点是,您可以获得整个图像的单个矢量,并使用简单的Eucledian距离执行图像比较。
你绝对可以使用MySQL来做这件事,因为你不需要kd-tree。一个简单的平衡二叉树就足够了。
RANSAC是一种估算对异常值具有鲁棒性的模型参数的方法。使用SURF功能将多张照片组合成3D场景非常有用。
检查误报肯定是一个机器学习练习,我在那个领域没有受过良好的训练。您可以使用有监督的学习算法(例如SVM,提升决策树或神经网络)来做到这一点,但我不知道如何建议您。
希望这有帮助!
答案 1 :(得分:1)
我将回答5,因为templatetypedef解决了其余问题。 RANSAC是一种参数估计方法(有点像找到最适合一组数据点的线)。所以它在最近邻搜索中没有直接用处。