在opencv中经常需要画多边形,有的需要填充有的只需画个线,有的需要在原始图上,有的需要二值图,反正我是有点受够了在不同场合需求下不断拼凑,不断重复操作,为此我整理一下,把画多边形的代码汇总:
class PolygonDraw:
def getdrawpolygonvaliddata(self,Polygon0):
if isinstance(Polygon0, list):
Polygon0=np.array(Polygon0)
if Polygon0.ndim < 3:
Polygon = [Polygon0]
else:
Polygon = Polygon0
if Polygon.dtype in [np.float32,np.float64]:
Polygon=np.int32(Polygon)
return Polygon
def drawfillim(self,im,polygon,fillcolor):
try:
cv2.fillPoly(im, polygon, fillcolor) # 只使用这个函数可能会出错,不知道为啥
except:
try:
cv2.fillConvexPoly(im, polygon, fillcolor)
except:
print('cant fill\n')
return im
@classmethod
def drawpolygonlinesim(cls,impath, polygon0, linecolor,thickness=2):
im = cv2.imread(impath)
polygon = PolygonDraw().getdrawpolygonvaliddata(polygon0)
cv2.polylines(im, polygon, True, linecolor, thickness)
return im
@classmethod
def drawpolygonfillim(cls,impath, polygon0, fillcolor):
im = cv2.imread(impath)
polygon = PolygonDraw().getdrawpolygonvaliddata(polygon0)
im=PolygonDraw().drawfillim(im, polygon, fillcolor)
return im
@classmethod
def drawpolygonbinim(cls,impath, polygon0, fillcolor):
im = cv2.imread(impath)
imshape = im.shape
binim = np.zeros(imshape, np.uint8)
polygon = PolygonDraw().getdrawpolygonvaliddata(polygon0)
binim= PolygonDraw().drawfillim(binim, polygon, fillcolor)
return binim
@staticmethod
def test():
impath = '../Data/DSC00033.jpg'
polygon = []
im = PolygonDraw.drawpolygonlinesim(impath, polygon, (0, 255, 0))
cv2.imwrite('../Data/drawpolygonlinesim.jpg', im)
im = PolygonDraw.drawpolygonfillim(impath, polygon, (0, 255, 0))
cv2.imwrite('../Data/drawpolygonfillim.jpg', im)
im = PolygonDraw.drawpolygonbinim(impath, polygon, (0, 255, 0))
cv2.imwrite('../Data/drawpolygonbinim.jpg', im)