单应性?在某些视图中处理丢失棋盘角的 OpenCV 方法?

Posted

技术标签:

【中文标题】单应性?在某些视图中处理丢失棋盘角的 OpenCV 方法?【英文标题】:Homography? OpenCV method to handle missing chessboard corners in some views? 【发布时间】:2017-08-20 14:14:50 【问题描述】:

我刚刚安装了 OpenCV 3.2.0,我可以在this question 中找到this image 中的许多/大部分角落,方法是使用对比度然后使用cv2.findChessboardCorners(left_gray, (6,5)) 或使用cv2.goodFeaturesToTrack(gray_img,25,0.01,10),如@ 中所述987654323@.

虽然 findChessboardCorners 要么返回全部 6×5=30 个或 None,但我可以看到,对于质量较低的图像,有时并非所有点都可以找到 goodFeaturesToTrack 方法。

但是当我阅读documentation for cv2.calibrateCamera() 时,看起来对象点需要与每个视图的图像点一一对应。如果其中一个图像有缺失点,我必须找到它并将其从该图像的对象点列表中删除。

是否有一些 cv2 方法可以自动处理这个问题?

编辑:我现在想知道,cv2.findHomography() 是否使用了我在这里寻找的稳健方法之一?

当然,如果外部行或列全部丢失,则存在无法解决的歧义,但如果缺少一些内部点,则仍然可以进行校准。

我可能会尝试写一些东西,当然只是拒绝任何发现角数错误的视图,但是如果已经有一种现有的方法来处理不引起歧义的缺失点,我想尝试首先它。目标是尽可能地自动化该过程,而不会跳过每个找到的点数错误的图像。

【问题讨论】:

@LamarLatrell 你能帮我澄清一下我对 OpenCV 的理解吗? :-) 【参考方案1】:

您可以通过稍微改变正在使用的模式来解决这个问题。您需要在这里指定缺少哪些角。 OpenCV 有一个简单的解决方案:ChArUco 板。下面我附上了该模式使用的教程。

http://docs.opencv.org/3.1.0/df/d4a/tutorial_charuco_detection.html

使用 charuco,您可以指定检测哪些角 - 自动。然后您可以调整对象点进行校准。

如果您使用的是 python,则需要 aruco 库的包装器:

https://github.com/opencv/opencv_contrib/pull/554/

https://github.com/fehlfarbe/python-aruco/

以及在 python 中使用 charuco 的一些答案:

http://answers.opencv.org/question/98447/camera-calibration-using-charuco-and-python/?answer=98451#post-id-98451/


简单来说,来自linked tutorial,流程如下:

要定义 CharucoBoard,需要使用定义生成模式,然后还要指定检测算法的描述:

X 方向的棋盘格数。 Y 方向的棋盘格数。 正方形边长。 标记边的长度。 标记字典。 所有标记的 ID。

【讨论】:

好吧,这不是我想的那种事情,但它确实似乎是解决“缺角”问题的方法。这个周末我去试试,谢谢你的帮助!! 我试图使用这种方法来创建像 OP 这样的单应性,但它​​是镜像的! id 被正确绘制,但来自单应性的 warpPerspective 的结果被翻转。你知道是什么原因造成的吗?

以上是关于单应性?在某些视图中处理丢失棋盘角的 OpenCV 方法?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中的特征匹配+单应性以查找对象

带有特征检测和单应性的 OpenCV 对象检测

OpenCV单应性矩阵发现参数估算方法详解

从特征匹配/单应性中过滤掉误报——OpenCV

OpenCv warp单应性元素的透视意义

OpenCV仿射变换+投射变换+单应性矩阵