如果只是想撸代码,直接看下一篇:
先来铺垫几个用到的函数cv2.polylines
、cv2.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(不闭合) 的图:
不过有些标注的最后一个点和第一个点是相同的,这种情况下 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)
这样就绘制了两个多边形,但是颜色都是一样的,所以要绘制多个不同颜色的多边形,还是多次调用这个函数,而不是在这个列表传入多个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()
简单用法之需要传入图片、多边形的点 和 颜色
看到这里你也许会想做这样的操作:
cv2.fillPoly(img, # 原图画板
[pts-20, pts+30], # 多边形的点
color=(0, 0, 255))
你以为他的结果是这样的:
实际上的结果是这样的:
关于为啥是这样,我觉得图像学的知识可以给一个解释,应该是 多边形的扫描转换 那一节,感兴趣的诸位自己看看