Python Cv2 findChessboardCorners无法找到角点
我正在使用cv2 findChessBoardCorners在视觉应用程序中进行摄像机校准。我对函数的调用如下所示:Python Cv2 findChessboardCorners无法找到角点,python,opencv,computer-vision,calibration,Python,Opencv,Computer Vision,Calibration,我正在使用cv2 findChessBoardCorners在视觉应用程序中进行摄像机校准。我对函数的调用如下所示: def auto_detect_checkerboard(self, image): retval, corners = cv2.findChessboardCorners(image, (7, 7), flags=cv2.CALIB_CB_ADAPTIVE_THRESH +
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格式,定义下限/上限范围,并使用来执行颜色分割以获得二进制掩码
- 提取棋盘:获得二进制掩码后,我们将使用它来移除背景,并使用将棋盘部分与图像的其余部分分离。算术运算,对于定义hsv彩色图像中的roi非常有用
- 显示棋盘功能。从图像中提取棋盘后,我们将
设置为(7,7),并将patternSize
标志设置为adaptive_thresh+fast_check+规范化从图像中提取的图像
步骤:
- 颜色分割得到二值遮罩
- 使用遮罩移除背景
-
krn=cv2.getStructuringElement(cv2.MORPH_RECT,(50,30)) dlt=cv2.扩张(msk,krn,迭代次数=5) res=255-cv2.按位_和(dlt,msk)
- 显示棋盘特征
-
res=np.uint8(res) ret,拐角=cv2。findChessboardCorners(res,(7,7), 标志=cv2.CALIB\u CB\u自适应\u阈值+ cv2.CALIB\u CB\u快速检查+ cv2.CALIB_CB_标准化_图像) 如果ret: 印刷品(角落) fnl=cv2.图纸棋盘转角(img,(7,7),转角,ret) cv2.imshow(“fnl”,fnl) cv2.等待键(0) 其他: 打印(“未找到棋盘格”)
导入cv2
将numpy作为np导入
#加载图像
img=cv2.imread(“kFM1C.jpg”)
#彩色分割得到二值掩模
lwr=np.数组([0,0143])
upr=np.数组([179,61,252])
hsv=cv2.CVT颜色(img,cv2.COLOR\U BGR2HSV)
msk=cv2.inRange(高速列车、轻轨列车、不间断电源)
#棋盘
krn=cv2.getStructuringElement(cv2.morp_RECT,(50,30))
dlt=cv2.扩张(msk,krn,迭代次数=5)
res=255-cv2.按位_和(dlt,msk)
#显示棋盘特征
res=np.uint8(res)
ret,拐角=cv2。findChessboardCorners(res,(7,7),
标志=cv2.CALIB\u CB\u自适应\u阈值+
cv2.CALIB\u CB\u快速检查+
cv2.CALIB_CB_标准化_图像)
如果ret:
印刷品(角落)
fnl=cv2.图纸棋盘转角(img,(7,7),转角,ret)
cv2.imshow(“fnl”,fnl)
cv2.等待键(0)
其他:
打印(“未找到棋盘格”)
要查找遮罩的上下边界,您可能会发现有用的:当您尝试使用
cv.findChessboardCorners(image,(7,7),None)
?另外,当您使用3,6或6,7更改(7,7)时,结果仍然不变?请尝试使用返回角点[0][0],角点[1][0]
<代码>转角[0][1]给我一个错误。但是代码可以检测49个角。问题可能出在您没有发布的代码中。@YunusTemurlenk我在没有附加标志的情况下尝试过,这也没什么不同,在寻找较小的棋盘时会更成功,但实际上我的应用程序要求我能够检测到整个问题。@Rotem您是对的,我在访问角点时出错,但这似乎不是问题的全部。由于没有检测到电路板,它仍然经常根本没有命中代码块。
lwr = np.array([0, 0, 143])
upr = np.array([179, 61, 252])
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
msk = cv2.inRange(hsv, lwr, upr)