我在视觉应用程序中使用cv2 findChessBoardCorners进行摄像头校准。我对函数的调用如下所示:
def auto_detect_checkerboard(self, image):
retval, corners = cv2.findChessboardCorners(image, (7, 7), flags=cv2.CALIB_CB_ADAPTIVE_THRESH
+ cv2.CALIB_CB_EXHAUSTIVE)
if(retval):
return corners[0][0], corners[0][1]
else:
print("No Checkerboard Found")
assert False
但它似乎无法在我迄今为止尝试过的所有图像上找到任何角落。我使用过的最琐碎的例子是
我使用函数时是否有问题?或者图像是否有问题需要在预处理时处理?
到目前为止,我已经尝试转换到灰度,并应用高斯过滤器,这两种似乎都没有产生影响。
2条答案
按热度按时间vm0i2vca1#
我的方法是先进行颜色分割得到二值化模板,然后利用二值化模板去除背景,使棋盘可见,去除伪影,最后精确输出棋盘边界特征。
cv2.inRange
执行颜色分割以获得二进制掩码。cv2.bitwise_and
算术运算将象棋部分与图像的其余部分分离,并且对于定义HSV彩色图像中的ROI非常有用。patternSize
为(7,7),并且设置flags
为adaptive_thresh + fast_check + normalize图像,这是从source得到的启发。步骤:
代码:
要查找遮罩的上边界和下边界,您可能会发现以下内容很有用:HSV-Threshold-script
f0ofjuux2#
在我的环境(opencv-python 4.7.0.68,opencv 4.5.4)中,只需要将其转换为灰度就可以使其工作,而不需要额外的调整(至少检测到了除左下角以外的所有角)。
findChessboardCorners no resize
还有findChessboardCornersSB,从我的经验来看,它一般比普通版本好用,但是我不知道这两种方法之间的基准差异。
findChessboardCornersSB