python - 单应?在某些 View 中处理丢失的棋盘角的 OpenCV 方法?

标签 python opencv camera-calibration

我刚刚安装了 OpenCV 3.2.0,我可以在 this image 中找到很多/大部分角落来自 this question通过使用对比度然后使用 cv2.findChessboardCorners(left_gray, (6,5)) 或使用 cv2.goodFeaturesToTrack(gray_img,25,0.01,10) 作为在 the answer 中描述.

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

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

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

编辑:我现在想知道,cv2.findHomography() 使用的是我在这里寻找的一种可靠方法吗?

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

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

最佳答案

您可以通过稍微改变所使用的模式来解决这个问题。您在这里需要的是指定缺少哪些角。 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。

enter image description here

enter image description here

关于python - 单应?在某些 View 中处理丢失的棋盘角的 OpenCV 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45783071/

相关文章:

python - 如何在Python中绘制双变量数据的饼图

python - 隐藏 matplotlib 的直方图输出

matlab - K 均值聚类,主要理解问题

opengl - 增强现实OpenGL+OpenCV

python - 是否可以使用有序字典或列表进行绘图,OrderedDict 不起作用

python - 使用 cattrs 解构复杂的类

java - 从 org.bytedeco.javacv.Frame 转换为 matlab 图像

c++ - OpenCV错误使用逆

iPhone 5s 相机校准参数

ios - 我们如何使用 swift 和 iOS 11+ 进行直线图像转换