如果只是想撸代码,直接看下一篇:

先来铺垫几个用到的函数cv2.polylinescv2.fillPoly

以下

import cv2
import numpy as np


img = np.zeros((512,512,3)) #白色背景
color=(0,255,0)             #绿色

# ------ 五角星的顶点 ------ 
pts = np.array([[70,190],
                [222,190],
                [280,61],
                [330,190],
                [467,190],
                [358,260],
                [392,380],
                [280,308],
                [138,380],
                [195,260]])
# pts = pts.reshape((-1, 1, 2))  # reshape为 10x1x2 的 numpy.ndarray
print(pts.shape)     # (10, 1, 2)

# ------ 绘制图形 ------ 
cv2.polylines(img,
              # [pts-20, pts+30],
              [pts],
              True,    # 是否闭合
              color,
              5)
 

# ------ 以下是显示三件套 ------
cv2.imshow('show',img)
cv2.waitKey()
cv2.destroyAllWindows()

cv2.polylines 的参数:

  • 绘制的画板图
  • 绘制的多边形列表
  • 是否闭合的bool
  • 颜色
  • 粗细

  • 这是第三个参数为 True (闭合) / False(不闭合) 的图:

python画多边形 polylines python画多边形函数_python


不过有些标注的最后一个点和第一个点是相同的,这种情况下 False/True 都不影响,都会是闭合的,因为最后一个点和第一个点相同

  • 第四个参数是颜色注意是 BGR 的形式,(0, 0, 255) 是红色
  • 第五个参数是粗细,注意不能像画圆那样给 -1 来填充多边形,多边形填充有专用的函数 cv2.fillPoly
  • 接下来是最值得说的第二个参数,为啥是 [pts] 呢? 为啥是个列表呢? 要不我改成 [pts1, pts2] 试试?
    每次,这里就是可以传入多个形如[X, 1, 2] 的 np.ndarray

    我们这样做个实验:
cv2.polylines(img,
              [pts-20, pts+30],
              True,   # 是否闭合
              color,
              5)

python画多边形 polylines python画多边形函数_旧版_02


这样就绘制了两个多边形,但是颜色都是一样的,所以要绘制多个不同颜色的多边形,还是多次调用这个函数,而不是在这个列表传入多个array

  • 代码里有一行这个:
# pts = pts.reshape((-1, 1, 2))  # reshape为 10x1x2 的 numpy.ndarray

OKOK, 终于把 cv2.polylines 说完了,接下来说这个 cv2.fillPoly , 他的用法就比较简单了:

import cv2
import numpy as np


img = np.zeros((512,512,3)) #白色背景
color=(0,0,255)             # 红色

#五角星
pts = np.array([[70,190],
                [222,190],
                [280,61],
                [330,190],
                [467,190],
                [358,260],
                [392,380],
                [280,308],
                [138,380],
                [195,260],
                [70,190]])


cv2.fillPoly(img,   # 原图画板
             [pts], # 多边形的点
             color=(0, 0, 255))

 
cv2.imshow('show',img)
cv2.waitKey()

简单用法之需要传入图片、多边形的点 和 颜色

python画多边形 polylines python画多边形函数_numpy_03

看到这里你也许会想做这样的操作:

cv2.fillPoly(img,   # 原图画板
             [pts-20, pts+30], # 多边形的点
             color=(0, 0, 255))

你以为他的结果是这样的:

python画多边形 polylines python画多边形函数_numpy_04

实际上的结果是这样的:

python画多边形 polylines python画多边形函数_ico_05


关于为啥是这样,我觉得图像学的知识可以给一个解释,应该是 多边形的扫描转换 那一节,感兴趣的诸位自己看看