标签: ransac

如何检查获得的单应矩阵是否良好?

这个问题已被问到,但我仍然没有得到它.我通过cv::findHomography从一组点调用来获得单应矩阵.我需要检查它是否相关.
所提出的方法是计算内部的最大重投影误差并将其与阈值进行比较.但是经过这样的过滤后,我不断进行疯狂的变换,物体边界框转换成几乎一条直线或一些奇怪的非凸四边形,有自交叉等.
可以用什么约束来检查单应矩阵本身是否足够?

opencv image-processing computer-vision homography ransac

23
推荐指数
1
解决办法
1万
查看次数

RANSAC算法

任何人都可以告诉我如何使用RANSAC算法在两个具有一定重叠部分的图像中选择共同的特征点吗?问题来自基于特征的图像拼接.
替代文字 替代文字

image-processing detect homography ransac corner-detection

13
推荐指数
1
解决办法
1万
查看次数

OpenCV:如何使用findHomography()/ findFundamental()和RANSAC获取内部点

OpenCV本身不提供RANSAC功能,或者至少以这种形式提供,您可以调用它并完成它(例如cv::ransac(...)).能够使用RANSAC的所有函数/方法都有一个启用它的标志.然而,如果您实际上想要在估算单应性/基本矩阵之后使用内部RANSAC计算其他内容,例如在Octave或类似软件/点库中创建一个好的绘图,则应用其他算法并不总是有用.剩余的过滤匹配等.

在匹配两个图像之后,获得匹配的矢量.与此同时,我们当然在匹配过程中使用了两组关键点(每个图像一个).使用匹配和关键点,我们创建两个点向量(例如cv::Point2f points)并将它们传递给findHomography().从这篇文章和这篇文章中我发现了如何使用掩码标记内部函数,我们传递给该函数.掩码内的每一行都与内部/异常值有关.但是我无法弄清楚如何使用我的两组点中的行索引信息.查看OpenCV的源代码并没有让我太过分.In findFundamental()(类似于findHomography()它的签名和掩码部分)它们使用compressPoints(),它似乎以某种方式将我们作为输入的两个集合(源和目标点)合并为一个.在测试以确定掩模的性质时,我尝试了2组匹配点(转换cv::Keypoints为cv::Point2f- 标准程序).每组包含300分,所以总共有600分.返回的掩码包含300行(对于此主题,值并不重要).

编辑:在写这篇文章时,我发现了答案(见下文),但决定发布这个问题,以防有人需要尽快并以紧凑的形式提供这些信息.请注意,我们仍然需要一个支持RANSAC的OpenCV功能.因此,如果您有一组点但无意计算单应性或基本矩阵,这显然不是方法,我敢说我无法在OpenCV的API中找到任何有用的东西,可以帮助避免这个障碍,因此您需要使用外部图书馆.

opencv mask extraction points ransac

11
推荐指数
1
解决办法
1万
查看次数

如何在笛卡尔坐标中使用 RANSAC 拟合一条线?

我正在使用 2D 激光雷达,并以相对于激光雷达位置的角度和距离的形式获取数据。我必须使用激光雷达创建平面图,下面给出的数据代表一个房间。我想使用 RANSAC 算法来查找房间的墙壁。如果我能装上 RANSAC,那么我相信我能以某种方式找到地板法兰。我写了一个代码,但它不适合我的墙。我应该做哪些修改才能让它适合我的房间墙壁?

#(angle, distance)
0,942
0.62,3469
1.25,3350
2.5,3410
3.12,3404
3.75,3403
4.37,3464
5,3441
5.62,3445
6.25,3444
6.87,3455
7.5,3464
8.12,3464
8.75,3477
9.37,3470
10,3504
10.62,3505
11.25,3505
11.87,3516
12.5,3529
13.12,3541
13.75,3543
14.37,3552
15,3559
15.62,3565
16.25,3578
16.87,3591
17.5,3607
18.12,3624
18.75,3634
19.37,3630
20,3651
20.62,3673
21.25,3678
21.87,3697
22.5,3711
23.12,3726
23.75,3744
24.37,3765
25,3780
25.62,3796
26.25,3809
26.87,3830
27.5,3867
28.12,3881
28.75,3854
29.37,3751
30,3689
30.62,3637
31.25,3589
31.87,4029
37.5,3483
50,2734
53.75,1686
54.37,1656
55,1631
55.62,1621
56.25,1608
56.87,1600
57.5,1595
58.12,1598
58.75,1596
59.37,1604
60,1611
60.62,1622
61.25,1644
61.87,1673
65,2212
65.62,2221
66.25,1037
66.87,1299
67.5,2086 …
Run Code Online (Sandbox Code Playgroud)

python ransac scikit-learn

11
推荐指数
2
解决办法
2988
查看次数

任意2D集的类RANSAC实现

TL; DR:是否有RANSAC的C++实现或其他可以与任意2D点集自由使用的强大对应算法?

我知道存在许多包括或利用诸如RANSAC(随机抽样共识)之类的对应算法的实现.它们经常用于计算机视觉应用中,并且可以在诸如OpenCV,PCL等的库中找到.通用算法是众所周知的,并且各种站点列出了不同的步骤.

现在,我发现的所有"高级"实现(为OpenCV,PCL等完成)都是针对具有一组基本假设的特定类型的问题.在OpenCV中,您希望在第一个图像和第二个图像的一部分(此示例)之间找到单应矩阵.在PCL中,您处于3D点云领域,而且(据我所知)您只能匹配特定的,已定义的形状(线条,球体等).

我"简单地"想要做的是采取任意2D点集(可能包含一些噪声)并在更大的2D点集合中找到对应关系(其中也包含一些噪声和其他点).除了输入两组点之外,它不需要特定的模型训练.我正在使用C++实现它,但是:

  • 我不是一个经验丰富的程序员,我需要整个事情来执行得相当快; 我自己已经完成的众所周知的算法(边缘检测,高斯模糊等)已经证明比经过验证的实现要慢得多(> 10x).

  • 简单地扯掉已经存在的开源实现(例如OpenCV)已被证明超出了我目前的能力(过多的依赖关系和虚拟实现模板等等)

所以,如果有人知道我错过了一个可以自由使用(BSD之类)和经过验证的C++实现......

c++ opencv signal-processing point-cloud-library ransac

9
推荐指数
1
解决办法
1万
查看次数

OpenCV C++ findHomography掩码值的含义

我正在使用findHomographyOpenCV 的功能和RANSAC方法,以找到与一组关键点链接的两个图像相关的单应性.主要问题是我无法找到函数输出的掩码矩阵的值.只有我知道的信息是0值是异常值,非零值是内点.但这意味着内部值是多少?有谁知道?

提前致谢!

我打电话给的一段代码findHomography:

cv::Mat H12;
cv::Mat mask;

H12 = cv::findHomography(FvPointsIm1, FvPointsIm2, mask, CV_RANSAC, 5); 
ui->Debug_Label->setText(Mat2QString(mask));
Run Code Online (Sandbox Code Playgroud)

c++ opencv computer-vision homography ransac

7
推荐指数
1
解决办法
7809
查看次数

在Opencv中仅使用平移,旋转和缩放计算Homography

我有两套积分,我想找到它们之间最好的转换.在OpenCV中,您具有以下功能:

Mat H = Calib3d.findHomography(src_points, dest_points);
Run Code Online (Sandbox Code Playgroud)

使用RANSAC返回3x3 Homography矩阵.我现在的问题是,我只需要翻译和轮换(可能是规模),我不需要仿射和透视.

问题是,我的观点只有2D.

(1)是否存在计算类似单应性但自由度较低的函数?

(2)如果没有,是否有可能从3x3单应矩阵中提取仅进行平移和旋转的3x3矩阵?

在此先感谢您的帮助!

伊萨

opencv transformation matrix ransac

7
推荐指数
1
解决办法
8583
查看次数

RANSAC多元回归

我使用RANSAC作为我强大的回归方法.我在这里找到了一个整洁的工具箱,由Marco Zuliani执行RANSAC.我看到有一个线和一个平面的例子但是如果在多元回归中存在许多自变量会怎么样呢.反正有没有修改代码来处理这个问题?

到目前为止我尝试的是修改3D代码来处理N维.当我这样做时,我得到所有的点作为内点,我知道可能是不正确的.这是过度拟合数据.以下是我厌倦的修改.

因为test_RANSAC_plane.m我刚刚添加了更多行X

用于estimate_plane.m:

function [Theta, k] = estimate_plane(X, s)
    % cardinality of the MSS
    k = size(X,1);

    if (nargin == 0) || isempty(X)
        Theta = [];
        return;
    end;

    if (nargin == 2) && ~isempty(s)
        X = X(:, s);
    end;

    % check if we have enough points
    N = size(X, 2);
    if (N < k)
        error('estimate_plane:inputError', ...
            'At least k points are required');
    end;

    A = [];
    for i=1:k
        A = [A …
Run Code Online (Sandbox Code Playgroud)

matlab regression ransac

7
推荐指数
1
解决办法
908
查看次数

如何在Python OpenCV中应用RANSAC

有人可以告诉我如何应用RANSAC找到最好的4个特征匹配点及其相应的(x,y)坐标,以便我可以在我的单应性代码中使用它们吗?

功能匹配点由SIFT获得,这里是代码:

import numpy as np
import cv2
from matplotlib import pyplot as plt

def drawMatches(img1, kp1, img2, kp2, matches):
    rows1 = img1.shape[0]
    cols1 = img1.shape[1]
    rows2 = img2.shape[0]
    cols2 = img2.shape[1]

    out = np.zeros((max([rows1,rows2]),cols1+cols2,3), dtype='uint8')

    # Place the first image to the left
    out[:rows1,:cols1] = np.dstack([img1, img1, img1])

    # Place the next image to the right of it
    out[:rows2,cols1:] = np.dstack([img2, img2, img2])

    # For each pair of points we have between both images
    # draw circles, then connect …
Run Code Online (Sandbox Code Playgroud)

python opencv homography ransac

6
推荐指数
1
解决办法
1万
查看次数

如何检测数据在DataFrame中线性变化的连续跨度?

我正在尝试检测连续的跨度,其中相关变量在DataFrame中的某些数据中线性变化.数据中可能存在许多满足此要求的跨度.我使用ransac基于使用RANSAC的鲁棒线性模型估计开始了我的方法.但是,我在使用该示例进行数据时遇到问题.

目的

检测相关变量,其中相关变量在数据内线性变化.要检测的跨度由超过20个连续数据点组成.期望的输出将是放置连续跨度的范围日期.

玩具示例

在下面的玩具示例代码中,我生成随机数据,然后设置数据的两个部分以创建线性变化的连续跨度.然后我尝试将线性回归模型拟合到数据中.我使用的其余代码(这里没有显示)只是使用RANSAC页面的Robust线性模型估计中的其余代码.但是我知道我需要更改剩余的代码才能达到目标.

import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model, datasets
import numpy as np

## 1. Generate random data for toy sample
times = pd.date_range('2016-08-10', periods=100, freq='15min')
df = pd.DataFrame(np.random.randint(0,100,size=(100, 1)), index=times, columns=["data"])

## 2. Set line1 within random data
date_range1_start = "2016-08-10 08:15"
date_range1_end = "2016-08-10 15:00"
line1 = df.data[date_range1_start:date_range1_end]
value_start1 = 10
values1 = range(value_start1,value_start1+len(line1))
df.data[date_range1_start:date_range1_end] = values1

## 3. …
Run Code Online (Sandbox Code Playgroud)

python numpy pandas ransac scikit-learn

6
推荐指数
2
解决办法
260
查看次数