通过点和线计算CV2单应性。

3

我有一个领域中的点列表(例如upper_goal_point/left_upper_outer_corner等)。

enter image description here

我知道它们在目标图像中的相应坐标 - 因此我可以计算出单应性:

h, status = cv2.findHomography(pts_src, pts_dst)

我在上角线上也有蓝色点(请参见上图),我只知道它们的目标y坐标为0(因为它们在上方线上),但我不知道它们确切的位置在哪里。
我能否使用这些蓝点来改善单应性?
附言:
您可以看到单应性中的上角线不是水平线,而是对角线,这当然是不正确的:

enter image description here


1
据我所知,在标准的单应性估计方法中,没有办法使用线条,因为你需要点对应关系。但是你可以使用线条来测试你的单应性质量。如果你知道一条线段的实际长度,你可以沿着那条线生成点。 - Micka
@Micka 我实际上是在用它进行测试(: 但是有很多得分低的帧,所以我想也许可以在计算单应性时利用这些知识。我还考虑在outer_corner线上创建人工点(例如,计算outer_corner线和upper_corner线之间的交点,距离left_upper_corner点约16.5米)。 - Yagel
1
交集也是我首先想到的,如果框线是直的、距离正确且镜头畸变较低,则可以正常工作。在那些图像中看起来还不错。 - Micka
1
单应矩阵估计是位姿估计(在两个视点之间)。 线约束比点约束要弱,但我认为将其添加到位姿估计中会产生相应的效果。 - fana
1
或者...将蓝色点的x坐标值视为估计目标,这可能是一种方法? 它们(x坐标)可以根据cv2.findHomography结果的评估进行更新。 因此,可能可以构建一个迭代方法(findHomography->更新x->findHomography->更新x...)。 - fana
显示剩余4条评论
1个回答

4
事实上,在查找单应性时可以使用线对应。
几年前,我们在一个项目中实现了这个方法。在简化所有数学运算的过程中,我们发现了一个简单的技巧。我们将每条线性方程“ax+by+c=0”转换为点“(a/c, b/c)”。
参考链接:https://www.researchgate.net/publication/220845575_Combining_Line_and_Point_Correspondences_for_Homography_Estimation
// ***  Don't copy paste this code, read below!  ***//
Point2f convertPointsToHomogeneousLine(Point2f p1, Point2f p2) {
    Point3f p1h(p1.x, p1.y, 1);
    Point3f p2h(p2.x, p2.y, 1);
    Point3f lineHomo(p1h.y*p2h.z - p1h.z*p2h.y,
                     p1h.z*p2h.x - p1h.x*p2h.z,
                     p1h.x*p2h.y - p1h.y*p2h.x);
    
    Point2f lineHomoNorm(lineHomo.x / lineHomo.z,
                         lineHomo.y / lineHomo.z);
    return lineHomoNorm;
}

将这些点传递到内部。据我记得,我还挖掘了OpenCV中findHomography的实现,并在某个位置内插入了这些行以解决步骤问题。在传递给解决步骤之前,OpenCV内部对这些点进行了一些规范化处理。因此,您需要跳过此类点的此步骤。

我们不在生产中使用它。用户需要通过提供图像上和米制系统中的线和点来手动校准相机。它的界面过于复杂且稳定性较差。但在您的情况下,我认为它可能会更有效。如果您能自动找到线条和对应关系。

请注意,在论文中他们使用了一些规范化技术。 它会提高稳定性。我们在旅程中遇到了稳定性问题,但未解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接