opencvで多角形画像の作成

やること

cv2.fillConvexPoly()を使って多角形画像を塗りつぶす

なぜか

semantic segmentationやinstance segmentationの出力結果は画像で出す場合もあれば、ポリゴンの頂点情報のみの場合もある。
頂点情報の場合、直感的にわかりにくいので画像で出力するほうがよい。
そのため、頂点のリストを結んで塗りつぶす方法をメモしておきたい。

コード

import numpy as np
import cv2
import matplotlib.pyplot as plt
% matplotlib inline
USIZE = 256
VSIZE = 256
CHANEL = 3
MAXHEIGHT = 50
MAXWIDTH = 50

def makeImage():
  image = np.zeros((256, 256, 3))
  boxnum = 5
  for j in range(5):
    node = []
    for i in range(boxnum):
      sx = np.random.randint(0, USIZE-MAXWIDTH)
      sy = np.random.randint(0, USIZE-MAXHEIGHT)
      node.append([sx, sy])
    node = np.asarray(node)
    color_b = np.random.randint(0, 255)
    color_g = np.random.randint(0, 255)
    color_r = np.random.randint(0, 255)
    image = cv2.fillConvexPoly(image, points=node, color=(color_b, color_g, color_r))
  image = image.astype(np.uint8)
  plt.figure()
  plt.imshow(image)

makeImage()

出力結果

f:id:techsho:20200404144339p:plain
出力結果

よく書き間違える部分 cv2.fillConvexPoly()に渡すpointはnumpyの配列であること。

for i in range(boxnum):
      sx = np.random.randint(0, USIZE-MAXWIDTH)
      sy = np.random.randint(0, USIZE-MAXHEIGHT)
      node.append([sx, sy])
node = np.asarray(node)