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()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值