经过上一篇的铺垫:
https://blog.csdn.net/HaoZiHuang/article/details/127026323
本节来写绘制分割结果的函数
先来设计一下函数的 API, 首先输入是 input_polygen
和 colors
,以及输入绘图的图片
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()