问题描述
我在视觉应用程序中使用 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
但到目前为止我尝试过的所有图像似乎都没有找到任何角落。我用过的最简单的例子是
我使用该功能有问题吗?还是我在预处理中需要处理的图像有问题?
到目前为止,我已尝试转换为灰度,并应用高斯滤波器,但两者似乎都没有效果。
解决方法
我解决这个问题的方法是执行颜色分割以获得二进制掩码。接下来,使用二进制掩码去除背景,使板可见,从工件中去除。最终准确输出国际象棋边界特征。
-
-
执行颜色分割:我们将加载的图像转换为 HSV 格式,定义下/上范围,并使用
cv2.inRange
执行颜色分割以获得二值掩码。
-
执行颜色分割:我们将加载的图像转换为 HSV 格式,定义下/上范围,并使用
-
-
提取棋盘:在获得二值掩码后,我们将使用它去除背景,并使用
cv2.bitwise_and
将棋盘与图像的其余部分分开。算术运算,对于在 hsv 彩色图像中定义 roi 非常有用。
-
提取棋盘:在获得二值掩码后,我们将使用它去除背景,并使用
-
-
显示棋盘特征。从图像中提取棋盘后,我们将
patternSize
设置为 (7,7) 并将flags
设置为基于 source 启发的adaptive_thresh + fast_check + normalize 图像。
-
显示棋盘特征。从图像中提取棋盘后,我们将
步骤:
-
颜色分割以获得二进制掩码。
-
使用遮罩去除背景
-
显示棋盘特征
-
res = np.uint8(res) ret,corners = cv2.findChessboardCorners(res,(7,7),flags=cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE) if ret: print(corners) fnl = cv2.drawChessboardCorners(img,corners,ret) cv2.imshow("fnl",fnl) cv2.waitKey(0) else: print("No Checkerboard Found")
代码:
import cv2
import numpy as np
# Load the image
img = cv2.imread("kFM1C.jpg")
# Color-segmentation to get binary mask
lwr = np.array([0,upr)
# Extract chess-board
krn = cv2.getStructuringElement(cv2.MORPH_RECT,msk)
# Displaying chess-board features
res = np.uint8(res)
ret,fnl)
cv2.waitKey(0)
else:
print("No Checkerboard Found")
要查找掩码的上下边界,您可能会发现有用:HSV-Threshold-script