opencv 寻找轮廓线与轮廓线的交点, 轮廓与圆的交点

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

效果图:

opencv 寻找轮廓线与轮廓线的交点, 轮廓与圆的交点_第1张图片 opencv 寻找轮廓线与轮廓线的交点, 轮廓与圆的交点_第2张图片

opencv 寻找轮廓线与轮廓线的交点, 轮廓与圆的交点_第3张图片

上面角点坐标就是 轮廓和圆的交点坐标。

你可能感兴趣的:(opencv,opencv)