Bir*_*der 8 python opencv calibration computer-vision
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
但到目前为止,它似乎无法在我尝试过的所有图像上找到任何角落。我用过的最简单的例子是
我使用该功能有问题吗?或者我需要在预处理中处理的图像有问题吗?
到目前为止,我已经尝试转换为灰度并应用高斯滤波器,这两种方法似乎都没有产生任何作用。
我解决这个问题的方法是执行颜色分割以获得二进制掩模。接下来,使用二元掩模去除背景,使板可见,从工件中去除。最终准确输出国际象棋边界特征。
cv2.inRange以获得二进制掩模。cv2.bitwise_and。算术运算对于定义 HSV 彩色图像中的 ROI 非常有用。patternSize启发将 设为(7, 7) 并flags设为adaptive_thresh + fast_check + 标准化图像。脚步:
颜色分割以获得二值掩模。
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)
Run Code Online (Sandbox Code Playgroud)
使用蒙版去除背景
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)
Run Code Online (Sandbox Code Playgroud)
显示棋盘功能
krn = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 30))
dlt = cv2.dilate(msk, krn, iterations=5)
res = 255 - cv2.bitwise_and(dlt, msk)
Run Code Online (Sandbox Code Playgroud)
代码:
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, (7, 7), corners, ret)
cv2.imshow("fnl", fnl)
cv2.waitKey(0)
else:
print("No Checkerboard Found")
Run Code Online (Sandbox Code Playgroud)
要查找掩模的下边界和上边界,您可能会发现有用:HSV-Threshold-script
| 归档时间: |
|
| 查看次数: |
17516 次 |
| 最近记录: |