2

我们正在使用下图,我们尝试使用 opencv 的轮廓提取边界坐标

def apply_contours(image,img):
    contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # print(f"Total number of contours found = {str(len(contours))}")
    # get area of every contour
    
    contour_bboxes = list(map(lambda a : cv2.boundingRect(a), contours))
    contours_area = list(map(lambda a : area_rectangle(a) ,contour_bboxes))
    
    # make area and index as list
    list_of_areas = []
    for index,j in enumerate(contours_area):
        list_of_areas.append([index,j])
    # sort the max area contours in reverse (desc) order and pick top 3
    list_of_areas = sorted(list_of_areas, key = lambda x: x[1],reverse=True)
    
    list_bboxes = list_of_areas[:20]
    sep_contours = [contours[i[0]] for i in list_bboxes]
    contour_bboxes = list(map(lambda a : cv2.boundingRect(a), sep_contours))
    
    
#     cv2.imwrite("Centriolds.png",image_)
    x = find_independent_conoturs(contour_bboxes)
    print(x)
    
    image_ = image.copy()
    for i in x:
        pt1 = (i[0],i[1])
        pt2 = (i[0]+i[2],i[1]+i[3])
        color = (0,255,0)
        thickness = 2
        cv2.rectangle(image_,pt1, pt2,color, thickness)
    cv2.imshow('independent Contours', image_)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    print("Total independent contours ",len(x))
    
    list_of_areas = list_of_areas[:len(x)]
    # get contours based on index
    list_of_contours = [contours[i[0]] for i in list_of_areas]
    # draw contours
    get_cords = lambda x: [list(i[0]) for i in x]
    cordinates_request = []
    for i in list_of_contours:
        cordinates_request.extend(get_cords(i))
    
    print(f"total edges {len(cordinates_request)}")
#     print(cordinates_request)
    
#     cordinates_request = sorted(cordinates_request, key = lambda x: x[1])
    df = convert_to_df(cordinates_request)
    blank_img = np.zeros(image.shape, dtype=np.uint8)
    
    cv2.drawContours(image, list_of_contours, -1, (0, 255, 0), 1)
    cv2.imshow('Contours', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.imwrite(os.path.join(path_,"Image.png"),image)
    return image,df

我们在哪里使用此代码并且可以实现确切的点,请参阅下面的重叠图像。

但是,当我们导出这些坐标并尝试在插图图像上绘制时,这些坐标不会重叠。我们如何在 python 中实现这一点?

绘图图像:

绘图图像

突出显示的图像:

突出显示

4

0 回答 0