- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
OpenCV 本身不提供 RANSAC 函数,或者至少以您可以调用它并完成它的形式提供(例如 cv::ransac(...)
) .所有能够使用 RANSAC 的函数/方法都有一个启用它的标志。但是,如果您在估计单应矩阵/基本矩阵之后实际上想对 RANSAC 计算的内点做其他事情,这并不总是有用的,例如在 Octave 或类似的软件/点库中创建一个漂亮的图,在剩余的过滤匹配集等。
在匹配两张图片后,一个人会得到一个匹配向量。除此之外,我们当然还有在匹配过程中使用的 2 组关键点(每个图像一个)。使用匹配项和关键点,我们创建了两个点向量(例如 cv::Point2f points
)并将它们传递给 findHomography()
。来自 this和 this posts 我发现了如何使用我们传递给该函数的掩码来标记内点。掩码内的每一行都与一个异常值/异常值相关。但是我无法弄清楚如何使用我的两组点中的行索引信息。查看 OpenCV 的源代码并没有让我走得太远。在 findFundamental()
中(类似于 findHomography()
的签名和掩码部分),他们使用 compressPoints()
,它似乎以某种方式将我们作为输入的两组(源点和目标点)合并为一个。在测试以确定掩码的性质时,我尝试了 2 组匹配点(将 cv::Keypoints
转换为 cv::Point2f
- 标准程序)。每组包含 300 分,所以我们总共有 600 分。返回的掩码包含 300 行(值对于手头的这个主题并不重要)。
编辑:在写这篇文章时,我发现了答案(见下文),但还是决定发布这个问题,以防有人尽快以紧凑的形式需要此信息。请注意,我们仍然需要 OpenCV 的功能之一,它支持 RANSAC。所以如果你有一组点但无意计算单应性或基本矩阵,这显然不是方法,我敢说我无法在 OpenCV 的 API 中找到任何有用的东西来帮助避免这个障碍因此你需要使用一个外部库。
最佳答案
这个解决方案其实很简单。正如我们所知,掩码中的每一行都提供了我们是否有异常值的信息。但是,我们有 2 组点作为输入,那么包含单个值的行究竟如何表示两个点?在思考这两组点实际上是如何出现在 findHomography() 中时,这种索引的性质出现在我的脑海中(在我的例子中,我正在计算两个图像之间的单应性)。两个集合中的点数相同,因为它们是从我们的一对图像之间的匹配中提取的这一简单事实。这意味着我们掩码中的一行是两个集合中点的实际索引,也是两个图像的匹配向量中的索引。我已经成功地基于此手动引用了一小部分匹配点,结果符合预期。重要的是,您不要更改匹配的顺序以及您使用每个 cv::DMatch
中引用的关键点从它们中提取的 2D 点。您可以在下面看到一对内点的简单示例。
for(int i = 0; i < matchesObjectScene.size(); ++i)
{
// extract points from keypoints based on matches
pointsObject.push_back(keypointsObject.at(matchesObjectScene.at(i).queryIdx).pt);
pointsScene.push_back(keypointsScene.at(matchesObjectScene.at(i).trainIdx).pt);
}
// compute homography using RANSAC
cv::Mat mask;
cv::Mat H = cv::findHomography(pointsObject, pointsScene, CV_RANSAC, ransacThreshold, mask);
在上面的例子中,如果我们打印一些内点
int maskRow = 10;
std::cout << "POINTS: object(" << pointsObject.at(maskRow).x << "," << pointsObject.at(maskRow).y << ") - scene(" << pointsScene.at(maskRow).x << "," << pointsScene.at(maskRow).y << ")" << std::endl;
然后再次使用我们的关键点(也可以使用提取的 2D 点来完成)
std::cout << "POINTS (via match-set): object(" << keypointsObject.at(matchesCurrentObject.at(maskRow).queryIdx).pt.x << "," << keypointsObject.at(matchesCurrentObject.at(maskRow).queryIdx).pt.y << ") - scene(" << keypointsScene.at(matchesCurrentObject.at(maskRow).trainIdx).pt.x << "," << keypointsScene.at(matchesCurrentObject.at(maskRow).trainIdx).pt.y << ")" << std::endl;
我们实际上得到了相同的输出:
POINTS: object(462,199) - sscene(485,49)
POINTS (via match-set): object(462,199) - scene(485,49)
要获得实际的内点,我们只需检查掩码中的当前行是否实际包含 0 或非零值:
if((unsigned int)mask.at<uchar>(maskRow))
// store match or keypoints or points somewhere where you can access them later
关于OpenCV:如何使用 findHomography()/findFundamental() 和 RANSAC 获取内点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24456788/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!