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

如果只是想撸代码,直接看下一篇:
https://blog.csdn.net/HaoZiHuang/article/details/127027469

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

以下内容部分摘自:
http://www.juzicode.com/opencv-python-polylines-puttext

先看一下代码吧:

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(不闭合) 的图:

cv2.polylines、cv2.fillPoly 和 多边形绘制分割结果Python函数(一)_第1张图片
不过有些标注的最后一个点和第一个点是相同的,这种情况下 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)
    

cv2.polylines、cv2.fillPoly 和 多边形绘制分割结果Python函数(一)_第2张图片
这样就绘制了两个多边形,但是颜色都是一样的,所以要绘制多个不同颜色的多边形,还是多次调用这个函数,而不是在这个列表传入多个array

  • 代码里有一行这个:
    # pts = pts.reshape((-1, 1, 2))  # reshape为 10x1x2 的 numpy.ndarray
    
    我注释掉了,我看好多人的博客,都有这一行,我就我试了一下不用这个操作,结果可以运行,有这个操作还是可以运行,就有些离谱吧,可能 opencv 旧版本需要这个操作???

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.polylines、cv2.fillPoly 和 多边形绘制分割结果Python函数(一)_第3张图片

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

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

你以为他的结果是这样的:
cv2.polylines、cv2.fillPoly 和 多边形绘制分割结果Python函数(一)_第4张图片

实际上的结果是这样的:
cv2.polylines、cv2.fillPoly 和 多边形绘制分割结果Python函数(一)_第5张图片
关于为啥是这样,我觉得图像学的知识可以给一个解释,应该是 多边形的扫描转换 那一节,感兴趣的诸位自己看看

下一篇来看多边形分割结果绘制的函数
https://blog.csdn.net/HaoZiHuang/article/details/127027469

(最近好烦啊,意识到一直在搞别人写的函数怎么用… 很少自己写,我就是一个掉包侠wwwwww)

你可能感兴趣的:(每日一氵,python,opencv,numpy)