问题标签 [homography]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
958 浏览

computer-vision - 仿射单应性计算

假设您在两个图像之间有一个单应性 H。第一个图像是参考图像,其中平面对象覆盖了整个图像(并且它与图像平行)。第二个图像从另一个概略视图(运行时图像)描绘了平面对象。现在,给定参考图像 p=(x,y) 中的一个点,我在 p 周围有一个大小为 SxS(S<=20 像素)像素的矩形区域(称为补丁)。我可以使用运行时图像中的像素和逆单应性 H^(-1) 来解开这个补丁。

现在,我要做的是计算给定 H 的仿射单应 H_affine 适合点 p 周围的补丁。我使用的简单方法是计算 4 个点对应关系:补丁的四个角和运行时图像中的对应点(使用完整的单应性 H 计算)。给定这四个点对应(都属于点 p 的一个小邻域),可以计算仿射单应性求解一个简单的线性系统(使用黄金标准算法)。如此计算的仿射单应性将以合理的精度(低于 0.5 像素)逼近完整的射影单应性,因为我们处于 p 的小邻域中(如果尺度不是太不利,即补丁 SxS 不对应于运行时图像中的大图像区域)。

有没有更快的方法来计算 H_affine 给定 H(与点 p 和补丁 SxS 相关)?

0 投票
1 回答
2726 浏览

opencv - 使用任意已知几何关系计算单应矩阵

我正在将 OpenCV 用于光学测量系统。我需要在数码相机拍摄的两张图像之间进行透视变换。在相机的视野中,我放置了一组标记(位于一个公共平面上),我将它们用作两个图像中的对应点。使用标记的位置,我可以计算单应矩阵。问题是,我实际上想要转换其图像的被测量对象位于离标记很近的距离处,并且与标记平面平行。我可以测量这个距离。

我的问题是,在计算单应矩阵时如何考虑该距离,这是执行透视变换所必需的。

在我的解决方案中,强烈要求不要使用测量的对象点来计算单应性(这就是为什么我需要视野中的其他标记)。

如果描述不准确,请告诉我。

在此处输入图像描述

图中呈现的是示例性图像。

红色矩形为被测对象。它物理放置在圆形标记后面的一小段距离内。

我从不同的相机位置捕捉物体的图像。被测物体可以在每次采集之间变形。使用圆形标记,我想将对象的图像转换为相同的坐标。我可以测量对象和标记之间的距离,但我不知道,我应该如何修改单应矩阵以便在测量对象(而不是标记)上工作。

0 投票
5 回答
17413 浏览

c++ - OpenCV cv::findHomography 运行时错误

我正在使用Features2D + Homography 编译和运行代码来查找已知对象教程,我得到了这个

运行时错误。调试后我发现程序在 findHomography 函数处崩溃。

在 OpenCV 的介绍中,“cv 命名空间”一章说

一些当前或未来的 OpenCV 外部名称可能与 STL 或其他库冲突。在这种情况下,使用显式命名空间说明符来解决名称冲突:

我更改了代码并在任何地方使用显式命名空间说明符,但问题没有解决。如果可以的话,请帮我解决这个问题,或者说哪个函数与 findHomography 做同样的事情,并且不要让程序崩溃。

这是我的代码

0 投票
7 回答
37810 浏览

opencv - 基于4个共面点的单应矩阵计算相机位姿

我在视频(或图像)中有 4 个共面点,代表一个四边形(不一定是正方形或矩形),我希望能够在它们上面显示一个虚拟立方体,其中立方体的角正好位于角上的视频四边形。

由于这些点是共面的,我可以计算单位正方形的角(即 [0,0] [0,1] [1,0] [1,1])和四边形的视频坐标之间的单应性。

根据这个单应性,我应该能够计算出正确的相机位姿,即 [R|t],其中 R 是 3x3 旋转矩阵,t 是 3x1 平移向量,因此虚拟立方体位于视频四边形上。

我已经阅读了许多解决方案(其中一些在 SO 上)并尝试实现它们,但它们似乎只适用于一些“简单”的情况(比如视频四边形是正方形时),但在大多数情况下不起作用。

以下是我尝试过的方法(大部分都是基于相同的原理,只是翻译的计算略有不同)。令 K 为来自相机的内在矩阵,H 为单应矩阵。我们计算:

令 a1,a2,a3 为 A 的列向量,r1,r2,r3 为旋转矩阵 R 的列向量。

问题是这在大多数情况下不起作用。为了检查我的结果,我将 R 和 t 与 OpenCV 的 solvePnP 方法(使用以下 3D 点 [0,0,0] [0,1,0] [1,0,0] [1,1 ,0])。

由于我以相同的方式显示立方体,我注意到在每种情况下 solvePnP 都提供了正确的结果,而从单应性获得的姿势大多是错误的。

理论上,由于我的点是共面的,因此可以从单应性计算姿势,但我找不到从 H 计算姿势的正确方法。

关于我做错了什么的任何见解?

尝试@Jav_Rock 的方法后编辑

嗨 Jav_Rock,非常感谢您的回答,我尝试了您的方法(以及许多其他方法),这似乎或多或少都可以。尽管如此,在基于 4 个共面点计算姿势时,我仍然碰巧遇到了一些问题。为了检查结果,我与 solvePnP 的结果进行了比较(由于迭代重投影误差最小化方法,这会好得多)。

这是一个例子:

立方体

  • 黄色方块:解决 PNP
  • Black Cube:Jav_Rock 的技术
  • 青色(和紫色)立方体:给出完全相同结果的其他一些技术

如您所见,黑色立方体或多或少还可以,但看起来比例不太好,尽管向量看起来是正交的。

EDIT2:我在计算 v3 之后对其进行了归一化(为了强制正交性),它似乎也解决了一些问题。

0 投票
2 回答
8211 浏览

image-processing - OpenCV:用于查找单应性的 RANSAC 置信度参数

OpenCV 函数findhomography()在两个图像的匹配点之间找到一个单应变换。(见定义

为了找到匹配的点子集,可以使用 RANSAC。

这里有一个问题:与 OpenCV 中使用 RANSAC 的其他函数(例如findfundamentalMat(参见定义))相比,无法更改RANSAC置信度参数。 只有重投影阈值可以作为参数传递。

我查看了 OpenCV 源代码,并将findhomography()置信度硬编码为 0.995。

为了我的目的,我需要增加这个。有没有办法在不改变 OpenCV 源本身的值的情况下做到这一点?

是否有理由对此进行硬编码?

PS:我在 Ticket 1557 下添加了下一个颠覆的更改请求。

0 投票
3 回答
15363 浏览

computer-vision - 如何从单应性计算旋转和平移矩阵?

我已经使用emgucv (C#)中的SURF对同一场景的 2 张图像进行了比较,这些图像由一台具有不同视角(比如左右)的相机拍摄。它给了我一个用于 2D 转换的 3x3 单应矩阵。但现在我想在 3D 环境中制作这两个图像(使用 DirectX)。为此,我需要以 3D 形式计算第二张图像(右)与第一张图像(左)的相对位置和方向。如何计算第二张图像的旋转和平移矩阵?

我还需要第二张图像的 z 值。

我读了一些叫做“同质分解”的东西。是这样吗?

有没有人熟悉单应性分解并且有没有它实现的算法?

提前感谢您的帮助。

0 投票
2 回答
18255 浏览

opencv - OpenCV Homography,Transform a point,这段代码在做什么?

我正在使用由 OpenCV 计算的单应性。我目前使用这个单应性来使用下面的函数转换点。这个函数执行我需要的任务,但是我不知道它是如何工作的。

谁能准确地逐行解释最后3行代码背后的逻辑/理论,我知道这会改变点x,y,但我不清楚为什么会这样:

为什么是Zpxpy以这种方式计算,其中的元素h对应于什么?

非常感谢您的评论:)

0 投票
0 回答
841 浏览

opencv - 使用内在和转换矩阵的项目点

目前我正在使用 C# 和 emgucv.net 进行 3D 图像可视化项目。在该项目中,按照已经使用相同场景的 2 张图像完成的步骤(旋转和平移略有不同),

  1. 特征检测(SURF)、匹配和计算单应性
  2. 计算基本矩阵
  3. 使用上述基本矩阵和相机固有矩阵计算基本矩阵
  4. 最后计算旋转和平移矩阵

此外,我通过更改其符号,使用 R 和 T 的不同组合获得了转换矩阵(3X4 [R|T])的 4 个可能答案。现在我想从这 4 个答案中选择正确的转换矩阵。在此之前,我想检查其中一个答案是否正确。所以我必须使用“相机内在矩阵”和“变换矩阵”中的每一个重新投影第二张图像的点。之后,我可以将结果点与第二个图像点进行比较以确认结果(平移矩阵)。

我的问题是,如何使用 emgucv.net 重新组合平移矩阵(旋转 [3X3] 和平移 [3X1] 矩阵)和相机固有矩阵以将点投影到图像点?

或任何替代方法来确认我获得的转换矩阵?

提前感谢您的帮助。

0 投票
1 回答
8937 浏览

android - 获得 RANSAC 在 findHomography 中使用的 5 个点(OpenCV for Android)

在 OpenCV for Android 中,函数 org.opencv.Calib3d.findHomography(..) 返回齐次变换矩阵。例如,这仅返回单应性:

有没有办法从 Android OpenCV API 返回 RANSAC 实际使用的点?

0 投票
2 回答
7057 浏览

opencv - Having some difficulty in image stitching using OpenCV

I'm currently working on Image stitching using OpenCV 2.3.1 on Visual Studio 2010, but I'm having some trouble.

Problem Description I'm trying to write a code for stitching multiple images derived from a few cameras(about 3~4), i,e, the code should keep executing image stitching until I ask it to stop.

The following is what I've done so far: (For simplification, I'll replace some part of the code with just a few words)

For step 5., I followed the answer in the following thread and just changed some parameters: Stitching 2 images in opencv

However, the result is terrible though. I just uploaded the result onto youtube and of course only those who have the link will be able to see it.

http://youtu.be/Oy5z_7LeaMk

My code is shown below: (Only crucial parts are shown)

What else should I do to make the stitching better?

Besides, is it reasonable to make the Homography matrix fixed instead of keeping computing it ? What I mean is to specify the angle and the displacement between the 2 cameras by myself so as to derive a Homography matrix that satisfies what I want.

Thanks. :)