在这种情况下,如何提高OpenCV棋盘检测的准确性?

dbf7pr2w  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(240)

我想使用Python中的OpenCV跟踪这个立体鱼眼相机中棋盘格角的位置。

为了帮助算法,我只在图像中我知道棋盘的部分运行棋盘检测。下面是我用于图像一侧的代码。类似的代码用于右侧的其他棋盘。

# Extract the left checkerboard 
    img_L = img[box_L[0][1]:box_L[1][1], box_L[0][0]:box_L[1][0]]

    # Detect corners
    ret_L, corners_L = cv2.findChessboardCorners(img_L, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)

    if ret_L:
        # Improve accuracy
        corners_L = cv2.cornerSubPix(img_L, corners_L, (5,5),(-1,-1), criteria)
        # Draw the vertices
        img_L = cv2.drawChessboardCorners(img_L, CHECKERBOARD, corners_L, ret_L)
        # And draw it back into the main image
        InsertImage(img, img_L, box_L[0])

正如你所看到的,图像的质量不是很好,探测器很难做出很好的探测。棋盘不会移动很远,但我需要准确地知道它们的位置和形状以进行校准。
大约有三分之一的时间,左半部分根本检测不到棋盘(正如您在此图像中看到的那样),并且顶点抖动相当多。
由于我的设置和这些相机的物理性质,我不能做太多来提高图像质量。

问题:

1.我可以做些什么来改进棋盘检测?

  1. OpenCV中是否有更好的棋盘检测器?
    据我所知,棋盘格检测器只是使用鞍形检测器来检测角点。也许有某种算法可以使用长直边的交点来帮助提高精度?例如,是否有一个函数可以帮助将贝塞尔曲线拟合到棋盘格的线条上,然后我可以进行交点以获得顶点?下面是我使用绘图程序制作的一个示例:

mrphzbgm

mrphzbgm1#

如果我是你,我会尝试实现像你描述的线到点的方法。(因为,这可能是半天或一天的工作。)
比如说...

  • 腐 eclipse (形态学变换)将有助于检测图案区域。

图案将变成一个有许多白色的大黑色区域。

  • 如果您的象棋图案是矩形的,例如检测区域的minAreaRect将提供非常粗略的图案线方向。

这是粗略的,但足以将图案的边缘分为2组。

  • 对每条长边线进行曲线拟合,或局部拟合直线。

然后,从它们中确定拐角位置。
但是,正如已经提到的(作为问题的评论),我认为有必要首先准备一些准确性评估方法。

相关问题