Registro do algoritmo Opencv: como usar o Opencv para resolver a interseção de círculos, contornos e retas

Série avançada de artigos sobre aprendizado da linguagem C incorporada

GUN C Compiler Extended Grammar Study Notes (1) GNU C Special Grammar Part Detailed
GUN C Compiler Extended Grammar Study Notes (2) Declaração de atributos
GUN C Compiler Extended Grammar Study Notes (3) Funções embutidas, funções incorporadas e funções disponíveis Parâmetro variável armazenamento de matriz de macro
e notas de estudo de ponteiro (1) tipo de dados e armazenamento, alinhamento de dados, migração de dados, typedef



  Recentemente, envolve o Opencv para resolver o problema de interseção de contornos e objetos regulares, como linhas retas ou círculos. O artigo a seguir registra isso em close. Explicação simples:通过创建轮廓与所求图像的掩膜,然后两者通过逻辑与运算得出交点位置。同理,求解两轮廓的交点方式也是一样的。

DEBUG = True
def contourCirclesIntersect(original_image, contour, circles):
    '''
    计算轮廓与内外圆的圆弧以及圆弧的圆心角
        @contour:轮廓数组
        @circles:圆坐标(cx,cy,r)
        return:
        @points:交点数组
        @arc_angle:圆弧圆心角
    '''
    # 获取图像大小
    blank = np.zeros(original_image.shape[0:2])
    # 创建轮廓与圆形的掩膜
    image1 = cv2.drawContours(blank.copy(), contour, -1, 2)
    image2 = cv2.circle(blank.copy(),(circles[0],circles[1]),circles[2],1,2)
    # 逻辑与判断交点
    intersection = np.logical_and(image1, image2)
    # 获得交点位置
    points = np.argwhere(intersection==True)
    if len(points) >= 2: # 找出大于2个交点的领域
        arc_angle = calcArcAngle(original_image,
        center=(circles[0],circles[1]),
        start=(points[0][1],points[0][0]),
        end=(points[-1][1],points[-1][0]),
        radius=circles[2],
        fill=1,
        color=(255,255,0)
        )
    R = circles[2]     
    if DEBUG:
        if len(points):
            cv2.circle(original_image,(points[0][1],points[0][0]),1,(0,255,0),2)
            cv2.circle(original_image,(points[-1][1],points[-1][0]),1,(0,255,0),2)
            cv2.line(original_image,(circles[0],circles[1]),(points[0][1],points[0][0]),(0,255,0),1)
            cv2.line(original_image,(circles[0],circles[1]),(points[-1][1],points[-1][0]),(0,255,0),1)
    return points,arc_angle

def contourLineIntersect(original_image,contour,line_pt):
    '''
        计算轮廓与直线的交点
        @contour:轮廓数组
        @line_pt:直线两点坐标[(x1,y1),(x2,y2)]
        return:
       	@points:交点数组
    '''
    # 获取图像大小
    blank = np.zeros(original_image.shape[0:2])
    # 创建轮廓与直线的掩膜
    image1 = cv2.drawContours(blank.copy(), contour, -1, 2)
    image2 = drawLine(blank.copy(),(line_pt[0][0],line_pt[0][1]),(line_pt[1][0],line_pt[1][1]))
    # 逻辑计算
    intersection = np.logical_and(image1, image2)
    # 获得交点位置
    points = np.argwhere(intersection==True)
    if DEBUG:
        if len(points):
            print('contourLineIntersect:',points)
            cv2.circle(original_image,(points[0][1],points[0][0]),1,(0,255,0),2)
            cv2.circle(original_image,(points[-1][1],points[-1][0]),1,(0,255,0),2)
    return points

Supongo que te gusta

Origin blog.csdn.net/qq_41866091/article/details/130813026
Recomendado
Clasificación