opencv 寻找轮廓线与圆的交点
在项目过程中 我遇到了一个问题就是要求一段不规则轮廓线与一个圆的交点,网上查了一些资料,如果轮廓线是规则的话还能算出轮廓线的方程可以方便的解出交点,但是现在轮廓线是不固定的不规则的所以无法解析出轮廓线的方程, 那么我只能用最笨的办法,弄两个存放圆和轮廓的掩膜然后做 and 运算,找出数值是1 的店就是我要的交点了。
程序如下:
#计算轮廓和圆的交点,返回交点坐标。
def get_contour_circle_intersection(contour,circle):
'''
计算轮廓和圆的交点,返回交点坐标。
contour:轮廓
circil:单通道灰度图
'''
mask = np.zeros(circle.shape, np.uint8) # 生成和circle 结构相同的掩膜
cv2.drawContours(mask, [contour], -1, 255, 1) #画出轮廓
dst=cv2.bitwise_and(mask,circle) #轮廓和圆的 与运算
dst=cv2.dilate(dst, None) #膨胀获得的点
res=get_corner(dst) #获得点的角点坐标
return res
def get_corner(grayimg):
"""角点测试 Demo
grayimg :为一个灰度图
返回 res
角点坐标,1,2是亚像素角点, 3,4是角点
"""
gray = np.float32(grayimg)
cornerP = cv2.cornerHarris(gray, 3, 5, 0.04)
cornerP[cornerP > 0] = 255
#cornerP=cv2.dilate(cornerP,None) #膨胀
ret, cornerP = cv2.threshold(cornerP, 0.01 * cornerP.max(), 255, 0) #阈值化二值化
cornerP = np.uint8(cornerP)
cv2.imshow('cornerP', cornerP)
# 图像连通域
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(cornerP) #??????????
# 迭代停止规则
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv2.cornerSubPix(gray, np.float32(centroids), (5, 5), (-1, -1), criteria) #计算亚像素角点
res = np.hstack((centroids[1:], corners[1:])) #列表 在水平方向上平铺
res = np.int0(res) #列表取整
return res
效果图:
上面角点坐标就是 轮廓和圆的交点坐标。