cv2.polylines、cv2.fillPoly 和 多边形绘制分割结果Python函数(二)

经过上一篇的铺垫:
https://blog.csdn.net/HaoZiHuang/article/details/127026323

本节来写绘制分割结果的函数

先来设计一下函数的 API, 首先输入是 input_polygencolors,以及输入绘图的图片

input_polygen 是一个列表,每个元素是多边形的列表
colors 是一个 np.ndarray, shape是 (N, 3), 传入的是 BGR color

input_polygen 的元素个数是 N, x ∗ x^* x 是每个元素的顶点数

  • input_polygen[0] shape 是 (x0, 2)
  • input_polygen[1] shape 是 (x1, 2)
  • input_polygen[N-1] shape 是 (xN_1, 2)

输出就是绘制了图形的图片


这是代码:

def _get_polygens_msk(img, polygens, colors):
    # 该函数只画阴影,不画边缘
    # 返回的也只是 mask
    
    mask = np.zeros_like(img)
    
    for p, c in zip(polygens, colors):
        cv2.fillPoly(mask, [p], color=c)
        
    return mask


def draw_seg_result(img, input_polygen, colors, thickness=4):
    
    
    # 先绘制阴影
    msk = _get_polygens_msk(img, input_polygen, colors)
    
    # 将阴影区域叠加到原图上
    imgWeig = cv2.addWeighted(img, 1, msk, 0.3, 0)  # 0.5 的参数可以调
    
    # 最后绘制所有的轮廓边缘
    for p, c in zip(input_polygen, colors):
        cv2.polylines(imgWeig, [p], True, tuple(c), thickness)
        
    return imgWeig

再给个测试用例:

if __name__ == "__main__":
    
    # 这是图片
    img = np.zeros((2256, 3008, 3), np.uint8)
    
    # 这是多边形顶点
    p_list = \
        [np.array([[1139, 1408],
               [1141, 1410],
               [1146, 1412],
               [1147, 1413],
               [1147, 1417],
               [1146, 1417],
               [1136, 1424],
               [1130, 1428],
               [1119, 1428],
               [1109, 1424],
               [1092, 1423],
               [1084, 1414],
               [1084, 1409],
               [1089, 1408],
               [1095, 1408],
               [1105, 1404],
               [1122, 1404],
               [1139, 1408]]),
         np.array([[1339, 1608],
               [1341, 1610],
               [1346, 1612],
               [1347, 1613],
               [1347, 1617],
               [1346, 1617],
               [1336, 1624],
               [1330, 1628],
               [1319, 1628],
               [1309, 1624],
               [1292, 1623],
               [1284, 1614],
               [1284, 1609],
               [1289, 1608],
               [1295, 1608],
               [1305, 1604],
               [1322, 1604],
               [1339, 1608]])]
        
    res = draw_seg_result(img, p_list, [(0, 0, 255), (0, 255, 255)])
    
    cv2.imshow("res", res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

cv2.polylines、cv2.fillPoly 和 多边形绘制分割结果Python函数(二)_第1张图片

你可能感兴趣的:(每日一氵,python,开发语言)