繁体   English   中英

从单应矩阵计算缩放、旋转和平移

[英]Calculating scale, rotation and translation from Homography matrix

我正在尝试计算视频的两个连续帧之间的缩放、旋转和平移。 所以基本上我匹配了关键点,然后使用 opencv 函数findHomography()来计算单应矩阵。
homography = findHomography(feature1 , feature2 , CV_RANSAC); //feature1 and feature2 are matched keypoints

我的问题是:如何使用这个矩阵来计算缩放、旋转和平移?。
任何人都可以向我提供有关如何操作的代码或解释吗?

正确的答案是使用单应性,因为它被定义为dst = H ⋅ src并探索它对特定点周围的小段的作用。

翻译

给定一点,翻译做

T = dst - (H ⋅ src)

回转

给定两个点 p 1和 p 2

p 1 = H ⋅ p 1

p 2 = H ⋅ p 2

现在只需计算向量 p 1 p 2和 p 1 ' p 2 ' 之间的角度。

规模

您可以使用相同的技巧,但现在只需比较长度:|p 1 p 2 | 和 |p 1 ' p 2 '|。

公平地说,使用另一个与第一个正交的段并平均结果。 您将看到没有恒定的比例因子或平移因子。 它们将取决于src位置。

给定单应矩阵H

    |H_00, H_01, H_02|
H = |H_10, H_11, H_12|
    |H_20, H_21, H_22|

假设

H_20 = H_21 = 0并归一化为H_22 = 1以获得 8 DOF。

沿 x 和 y 轴的平移直接从H计算:

tx = H_02
ty = H_12

左上角的2x2子矩阵被分解以计算剪切、缩放和旋转。 这里解释一种简单快速的分解方法。

注意:此方法假定矩阵可逆。

为了估计由单应性引起的树维变换和旋转,存在多种方法。 其中之一提供了用于分解单应性的封闭公式,但它们非常复杂。 此外,解决方案从来都不是唯一的。

幸运的是,OpenCV 3 已经实现了这种分解( decomposeHomographyMat )。 给定单应性和正确缩放的内在矩阵,该函数提供一组四种可能的旋转和平移。

问题似乎与 2D 参数有关。 单应矩阵捕获透视失真。 如果应用程序不会产生太多的透视失真,则可以使用仿射变换矩阵(仅使用缩放、旋转、平移且不使用剪切/翻转)来近似真实世界的变换。 以下链接将提供有关将仿射变换分解为不同参数的想法。

https://math.stackexchange.com/questions/612006/decomposing-an-affine-transformation

由于我不得不花费几天时间来创建我的单应变换函数,因此我将把它放在这里,以造福于所有人。

在这里您可以看到主循环,其中每个输入位置都乘以单应矩阵 h。 然后将结果用于将像素从原始位置复制到目标位置。

    for (tempIn[0] = 0; tempIn[0] < stride; tempIn[0]++)
    {
        for (tempIn[1] = 0; tempIn[1] < rows; tempIn[1]++)
        {
            double w = h[6] * tempIn[0] + h[7] * tempIn[1] + 1; // very important!
            //H_20 = H_21 = 0 and normalized to H_22 = 1 to obtain 8 DOF. <-- this is wrong

            tempOut[0] = ((h[0] * tempIn[0]) + (h[1] * tempIn[1]) + h[2])/w;
            tempOut[1] =(( h[3] * tempIn[0]) +(h[4] * tempIn[1]) + h[5])/w;


            if (tempOut[1] < destSize && tempOut[0] < destSize && tempOut[0] >= 0 && tempOut[1] >= 0)
                dest_[destStride * tempOut[1] + tempOut[0]] = src_[stride * tempIn[1] + tempIn[0]];
        }
    }

经过这样的过程,将产生具有某种网格的图像。 需要某种过滤器来去除网格。 在我的代码中,我使用了一个简单的线性过滤器。

注意:真正需要原始图像的中心部分才能生成正确的图像。 可以安全地丢弃某些行和列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM