[英]Calculating scale, rotation and translation from Homography matrix
我正在尝试计算视频的两个连续帧之间的缩放、旋转和平移。 所以基本上我匹配了关键点,然后使用 opencv 函数findHomography()
来计算单应矩阵。
homography = findHomography(feature1 , feature2 , CV_RANSAC); //feature1 and feature2 are matched keypoints
我的问题是:如何使用这个矩阵来计算缩放、旋转和平移?。
任何人都可以向我提供有关如何操作的代码或解释吗?
如果您可以使用 opencv 3.0,则可以使用这种分解方法http://docs.opencv.org/3.0-beta/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#decomposehomographymat
正确的答案是使用单应性,因为它被定义为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
位置。
为了估计由单应性引起的树维变换和旋转,存在多种方法。 其中之一提供了用于分解单应性的封闭公式,但它们非常复杂。 此外,解决方案从来都不是唯一的。
幸运的是,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.