- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要知道这个算法是否是已知的:
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算法的结果。
最佳答案
您问了很多问题,我想我无法回答所有问题,但这里已尽可能多地回答您的问题。
这无疑是一种最近邻算法,其目标是找到与第一个 vector 中的每个点最近的两个点,然后检查它们的距离之比是否小于某个截止值。
您可以使用四叉树或 kd 树执行此操作,但是因为您的点都是一维值,所以使用平衡二叉搜索树可以做得更好。给定这样一棵树,如果你通过节点串接一个链表,你可以通过在二叉搜索树中查找最近的元素 p 找到某个测试点 p 的 k 个最近邻居,然后在每个元素中遍历 (k + 1) 步方向并取你发现的 k 个最近点。这在时间 O(lg n + k) 中运行,其中 n 是点数,k 同上。这比您现在的效率要高得多,后者每次查找需要 O(n) 的时间。
如果你的特征向量的维度大于 1,但小于 20,那么使用 kd-trees 将是一个非常有效的措施。
对于更高的维度,您可能希望在应用 kd 树之前使用 PCA 减少维数,或者使用更具可扩展性的 ANN 结构,例如局部敏感哈希。
SURF 最适合场景和物体检测。如果你需要找出两个图像是否相同,你最好使用全局描述符算法,例如 GIST。使用全局描述符的优点是您可以获得整个图像的单个 vector ,并且使用简单的欧几里得距离执行图像比较。
您绝对可以使用 MySQL 来完成此操作,因为您不需要 kd-tree。一个简单的平衡二叉树就足够了。
RANSAC 是一种估计模型参数的方法,该方法对异常值具有鲁棒性。它对于使用 SURF 功能将多张照片组合成 3D 场景非常有用。
检查误报绝对是一项机器学习练习,我在这方面没有受过良好训练。您或许可以使用监督学习算法(例如支持 vector 机、提升决策树或神经网络)来执行此操作,但我的知识还不足以就此向您提供建议。
希望这对您有所帮助!
关于c++ - 解释这个算法(比较SURF算法中的要点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6950406/
OpenCV SURF function is not implemented 可能重复 我的错误代码是: error LNK2019: unresolved external symbol "pub
我在 http://opencv.willowgarage.com/documentation/python/feature_detection.html 阅读了 OpenCV SURF 手册“Ext
我正在使用 SURF 测试一些对象检测和 SIFT . SURF 声称比 SIFT 更快、更稳健,但我在测试中发现这不是真的。中等图像 (600*400) 的 SIFT 与 SURF 的速度相同,并且
我正在尝试像全景 View 一样在 Android 中拼接图像。我正在尝试使用冲浪描述符来拼接图像。我使用的是 2.4.0 版本的 openCv,因为较高版本不包含用于冲浪描述符的非自由文件夹。我有还
我正在尝试编写一个 matlab 代码来回答以下问题: Using functions linspace,meshgrid,surf and dot operations, plot the surf
在SURF技术中,更确切地说,在特征描述阶段,作者已经声明(如果我理解正确的话),描述将在20倍sigma的区域内执行。 Sigma代表检测到关键点的规模。 Sigma = 0.4 x L,其中L =
我正在尝试编写一个 matlab 代码来回答以下问题: Using functions linspace,meshgrid,surf and dot operations, plot the surf
我使用以下简单的代码从图像中提取 SURF 描述符: Ptr descriptor = DescriptorExtractor::create("SURF"); descriptor->com
我正在使用 Opencv C++ 进行人脸识别应用。为此,我使用 SURF 作为描述符,使用 FlannMatcher 来匹配点。我的代码如下, FlannBasedMatcher matcher;
有什么方法可以将 OPENCV SURF 中的关键点数量限制为 100 个?获取到的关键点会按照强度排序吗?如何获取描述符的强度?我正在使用 cpp 程序在 LINUX 系统中处理 OPENCV。 问
我有 2 个图像,在相机中有一点点方向,我想从 opencv 中找到方向,我从 2 个图像中获取冲浪关键点,我的问题是如何比较这 2 个关键点以找到方向。 最佳答案 您需要应用匹配器(例如 cv Fl
我正在尝试使用 OpenCV 和 SURF 方法实现交通标志识别器。我的问题是我得到随机结果(有时非常准确,有时显然是错误的)而且我无法理解为什么。这是我实现比较的方式: 首先我检测图像上的轮廓 然后
我正在尝试了解 SURF 特征检测的工作原理。我想我已经取得了一些进步。我想知道我离真正发生的事情有多远。 您已经存储的模板图像和真实世界图像根据“关键点”或一些重要特征进行比较在两张图片中。 相同点
任何人熟悉此错误?我实时测试了一个冲浪描述符。我想使用此功能来识别不同种类的鱼。有时程序可以,但有时会出错。编译成功。编译后显示此错误。 #include #include #include #
我在理解 SURF 和 SIFT 算法时遇到了一些概念问题 All about SURF .据我了解,SURF 发现高斯的拉普拉斯算子,而 SIFT 对高斯的差异进行运算。然后它围绕它构造一个 64
我有一个矩阵 Z,我想使用 surf 命令绘制它。我可以使用 surf 命令很好地绘制它,但我希望 Z 的一部分不显示在图中。我假设我需要做的是使用符号 surf(X,Y,Z) 其中 X 和 Y 是定
我想检测实时视频源中的 SURF 特征点,但是,我似乎找不到任何关于如何实现这一点的教程。 我能够在静止图像上检测到它们: int minHessian = 400; cv::Surf
我能够编译代码,但是当我运行它时,我收到了这个错误。 我在 Win 7 中使用 VS 2010 和 opencv 248。 感谢任何帮助。 最佳答案 遇到同样的问题。 SURF 开发人员说,为了使用库
最近,我在做机器人项目;我的机器人可以通过颜色检测物体,但我发现对于不同的物体来说还不够好。因此,我希望机器人实时浏览图像以找到将使用其模板定义的目标对象。 不幸的是,我不知道如何将模板的关键点与其图
在我的代码中,我根据最近的邻居距离比过滤好的图像,如下所示: for(int i = 0; i 0)) { good_matches.push_back(mat
我是一名优秀的程序员,十分优秀!