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()
出力結果
よく書き間違える部分
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)