- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对如何使用 OpenCV findHomography
方法计算最佳变换感到困惑。
我的使用方式如下:
cv::Mat h = cv::findHomography(src, dst, CV_RANSAC, 5.f);
无论我运行多少次,我都会得到相同的变换矩阵。我以为 RANSAC 应该随机选择一个点的子集来进行拟合,那么为什么它每次都返回相同的变换矩阵呢?它与一些随机数初始化有关吗?我怎样才能使这种行为实际上是随机的?
其次,如何调整此设置中的 RANSAC 迭代次数?通常迭代次数基于内点比率和诸如此类的东西。
最佳答案
I thought RANSAC is supposed to randomly select a subset of points to do the fitting, so why does it return the same transformation matrix every time?
RANSAC 反复选择点的一个子集,然后根据它们拟合模型,然后检查数据集中有多少数据点是给定拟合模型的内点。完成多次后,它会选择具有最多内点的拟合模型,并将模型重新拟合到这些内点。
对于任何给定的数据集、可变模型参数集和构成异常值的规则,将存在一个或多个(但通常恰好是一个)最大可能的“异常值”集。例如,给定此数据集(图像 from Wikipedia):
...然后通过某种合理的离群值定义,任何线性模型可以拥有的最大可能的离群值集是下面的蓝色:
我们将上面的蓝色点集称为最大可能的内点集 - I。
如果您随机选择少量点(例如两个或三个)并通过它们画出一条最适合的线,那么直观上显而易见的是,您只需尝试几次,直到您遇到以下迭代:
从那次迭代开始,所有进一步的迭代都是浪费,不可能进一步改进模型(尽管 RANSAC 无法知道这一点,因为它无法神奇地知道何时找到最大的内点集)。
如果相对于数据集的大小,迭代次数足够多,并且数据集中有足够大的比例是内点,那么您最终会以接近 100% 的几率找到最大的内点集每次运行 RANSAC 时。因此,RANSAC 将(几乎)总是输出完全相同的模型。
这是一件好事!通常,您希望 RANSAC 找到绝对最大的一组内点并且不想满足于任何更少的东西。如果您在这种情况下每次运行 RANSAC 时都得到不同的结果,则表明您想要增加迭代次数。
(当然,在上面的例子中,我们讨论的是尝试通过二维平面中的点拟合一条线,这不是 findHomography
所做的,但原理是相同的;通常仍然会有一组最大的内点,最终 RANSAC 会找到它。)
How can I make this behaviour actually random?
减少迭代次数 (maxIters
),以便 RANSAC 有时无法找到最大的内点集。
但除了纯粹的求知欲外,通常没有理由这样做;您基本上会故意告诉 RANSAC 输出劣质模型。
关于OpenCV RANSAC 每次都返回相同的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32036021/
我想知道是否有任何方法可以创建一个可用于 RANSAC 方案的模型,其中可以从嘈杂的 3D 点云确定样条线或多段线。 我拥有的是一个在每个 XY 平面上包含一组点的体积,例如在 Z 方向上有 400
我对如何使用 OpenCV findHomography 方法计算最佳变换感到困惑。 我的使用方式如下: cv::Mat h = cv::findHomography(src, dst, CV_RAN
我正在使用 RANSAC 作为我的稳健回归方法。我找到了一个整洁的工具箱 here它执行 Marco Zuliani 的 RANSAC。我看到有直线和平面的例子,但是如果像多元回归那样有很多自变量怎么
paper Fischler 和 Bolles 为 RANSAC 定义了 3 个未指定的参数。其中之一是 the threshold t, which is the number of compati
我已经能够在 3D 点云上为常用模型(即球体、线、平面)成功实现 RANSAC。然而,我很难思考如何为一个长方体做这件事,特别是一个 3d 盒子。我不确定如何使用点来参数化框。 理想情况下,我希望获得
我正在尝试使用 sklearn 的 RANSAC: RANdom SAmple Consensus 来拟合没有截距的线性模型(强制截距为 0)算法。在 LinearRegression可以很容易地设置
我正在使用 2D 激光雷达,并以相对于激光雷达位置的角度和距离的形式获取数据。我必须使用激光雷达创建平面图,下面给出的数据代表一个房间。我想使用 RANSAC 算法来查找房间的墙壁。如果我能装上 RA
我研究了如何使用 rand()%n(其中 n 是样本总数)生成两个随机整数,但它们似乎通常有偏差。 有没有更好(最好是更简单)的方法来生成 0 到 n(样本数)之间的随机数? n 是从包含数据点列表的
RANSAC 用于查找与两个图像相关的单应性矩阵。为了计算矩阵,我们需要至少 4 个对应关系。同形矩阵是描述任何透视变换的通用 3*3 矩阵。如果我们只给出3个对应关系,那么如何计算同源矩阵?由于两幅
我一直认为机器学习结果有所不同,因为数据每次都会预先随机洗牌,从而导致不同的训练集。因此,当没有随机播放时,每次的结果应该是相同的。与 sklearn.linear_model.LinearRegre
我有一个矩阵( vector 的 vector ),其中有几个点(来自传感器的测量值)应该代表墙壁。所有的墙都是平行/垂直的。 我想将这些点安装到各自的墙上。我想过使用 ransac,但我找不到一种简
我正在使用 SIFT 特征检测器和描述符。我正在匹配两个图像之间的点。我正在使用 OpenCV 的 findHomography() 函数和 RANSAC 方法。 当我读到 RANSAC 算法时,据说
matches = sorted(matches, key = lambda x: x.distance) src_pts = np.float32([ kp1[m.queryIdx].pt for
我有一组点,需要使用它们与相应正弦线的邻近度进行分组。我尝试使用标准霍夫变换来确定线条,但这并没有解决问题(只检测到几条线条)。 我想测试 RANSAC 是否能更好地检测各种 sin 曲线。你有类似算
我已经阅读了维基百科的文章并观看了一些关于 RANSAC 的视频。 如果我没理解错的话,优化RANSAC的方法之一如下: 根据 wikipedia ,它的最大迭代次数: 根据这个website ,在查
我正在使用 features2d(ORB、SIFT 等)进行一些对象检测 我正在使用 RANSAC 进一步研究单应性。我发现很多好的点被错误地标记为异常值。 对象(书)内部有很多不应该是异常值的异常值
TL;DR:是否有 RANSAC 或其他可自由用于任意二维点集的稳健对应算法的 C++ 实现? 我知道存在许多包含或使用对应算法(例如 RANSAC(随机抽样共识))的实现。它们通常用于计算机视觉应用
据我所知,OpenCV 使用 RANSAC 来解决 findHomography 的问题,它返回一些有用的参数,例如 homograph_mask。 但是,如果我只想估计 2D 变换,这意味着仿射矩阵
当使用 findHomography 时使用 OpenCV Features2D + Homography Documentation ,它调用 CV_RANSAC 作为它的第三个参数: Mat H
我有一组 3D 点。 Points_[x,y,z]% n*3 where n is number of points 我想安装一个平面(它是地板)并检查平面的高度。我认为这是二维问题。 z=bo+b1
我是一名优秀的程序员,十分优秀!