我想使用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.我可以做些什么来改进棋盘检测?
- OpenCV中是否有更好的棋盘检测器?
据我所知,棋盘格检测器只是使用鞍形检测器来检测角点。也许有某种算法可以使用长直边的交点来帮助提高精度?例如,是否有一个函数可以帮助将贝塞尔曲线拟合到棋盘格的线条上,然后我可以进行交点以获得顶点?下面是我使用绘图程序制作的一个示例:
1条答案
按热度按时间mrphzbgm1#
如果我是你,我会尝试实现像你描述的线到点的方法。(因为,这可能是半天或一天的工作。)
比如说...
图案将变成一个有许多白色的大黑色区域。
minAreaRect
将提供非常粗略的图案线方向。这是粗略的,但足以将图案的边缘分为2组。
然后,从它们中确定拐角位置。
但是,正如已经提到的(作为问题的评论),我认为有必要首先准备一些准确性评估方法。