识别的时候先二值化,之后识别轮廓,创建轮廓的结构树:
_, contours, hierarchy = cv2.findContours(th3, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
之后 hierarchy
中第四列表示其父轮廓,没有父轮廓的就是最外侧的轮廓,之后识别其子轮廓个数,子轮廓个数为 1,形状接近椭圆的基本就是标识点的轮廓了(图中红色标出的)。
利用面积法检查椭圆的代码:
def check_ellipse(contour, ell):
if ell is None:
ell = cv2.fitEllipse(contour)
if (((np.pi * ell[1][0] * ell[1][1] / 4) / cv2.contourArea(contour)) < 1.2) & \
(((np.pi * ell[1][0] * ell[1][1] / 4) / cv2.contourArea(contour)) > 0.8):
return True
else:
return False
实际拍摄的标识点较小的话就需要把阈值改大一点。
实际拍摄时会出现视角倾斜的情况,会拍成椭圆: