使用FeatureDetector,我在两个具有相同元素的图像上获得功能,并将此功能与BruteForceMatcher相匹配。 然后我使用OpenCv函数findHomography来获得单应矩阵
H = findHomography( src2Dfeatures, dst2Dfeatures, outlierMask, RANSAC, 3);
获取H矩阵,然后将图像与
对齐warpPerspective(img1,alignedSrcImage,H,img2.size(),INTER_LINEAR,BORDER_CONSTANT);
我需要知道检测到的元素的旋转角度,比例,位移。有什么简单的方法来获得这个比一些大的方程式?一些评估公式只是为了将数据放入?
答案 0 :(得分:3)
如果相机经过纯旋转或缩放而没有平移,则Homography会匹配位于平面上的元素的投影或任意3D的投影。因此,我们正在谈论的案例是指示我们的计算输入是什么:
- 平面目标,纯旋转,帧内单应性
- 平面目标,旋转和平移,目标到框架单应性
- 3D目标,纯旋转,帧到帧映射(受基本矩阵约束)
对于平面目标,通过帧到帧Homography(H 12 )可以轻松计算纯旋转: 给定内部相机矩阵A,帧H1的平面到图像的单应性,H2可以表示为H 1 = A,H 2 = A * R,H 12 = H2 * H1 -1 = A R A -1 因此R = A -1 < / SUP>ħ<子> 12 子> * A
如果元素位于平面上,则可以通过分析目标到帧的单应性来计算相机平移的旋转(达到未知比例)。请注意,目标可以只是其中一个视图。假设您将原始平面目标作为图像(以某个参考方向拍摄),您的任务是分解图像H 12 之间的单应性,这可以通过SVD完成。 H的前两列代表旋转martrix的前两列,并通过H = ULV T ,[r1 r2] = UDV T 恢复,其中D为3x2最后一行的标识矩阵全为0.旋转矩阵的第三列只是前两列的矢量乘积。 Homography的最后一列是翻译向量时间常数。
最后,对于3D和纯相机旋转中的点的任意配置,使用基本矩阵分解而不是单应性计算旋转,请参阅this
答案 1 :(得分:1)
cv::decomposeProjectionMatrix();
和
cv::RQDecomp3x3();
都与你想要的相似。
它们都不是完美的。它们背后的理论以及为什么你不能从3x3矩阵中提取所有参数有点麻烦。但简短的回答是3x3 proj矩阵是完全4x4矩阵的简化,基于所有点都保持在同一平面的事实。
答案 2 :(得分:1)
您可以尝试使用levenberg marquardt优化,其中参数将是平移和旋转,方程将通过两个图像的特征之间的计算距离来表示(仅使用来自ransac单应性的内部)。 这是LM http://www.ics.forth.gr/~lourakis/levmar/
的C ++实现