Wenn Sie das COCO-Format verwenden, möchten Sie häufig nur bestimmte Objekte extrahieren. Zu diesem Zeitpunkt ist es erforderlich, die Polygoninformationen als Maske zu verwenden, um ein Objekt aus dem Bild zu extrahieren. Selbst wenn ich nach dieser Methode suche, kann ich sie nicht finden. Dieses Mal werde ich eine solche Methode vorstellen.
Zunächst sollten Sie es in Sekunden sehen können, indem Sie den folgenden Code betrachten.
import cv2
src_img = cv2.imread("YOUR_PATH")
# parameter
sg = [1, 1, 2, 2, 3, 3]
bb = [1, 1, 2, 2]
# working file
mask = np.zeros_like(src_img) # (y, x, c)
# segmentation data
sg = np.asarray(sg[0])
poly_number = int(len(sg)/2)
poly = np.zeros( (poly_number, 2) )
for i in range(poly_number):
poly[i][0] = sg[(i * 2) + 0] # x
poly[i][1] = sg[(i * 2) + 1] # y
# generate mask
mask = cv2.fillConvexPoly(mask, np.array(poly, 'int32'), color=(255, 255, 255))
# generate src_img and mask_image
cv2.imwrite("./src_img.png ", src_img)
cv2.imwrite("./mask.png ", mask)
# masked image
masked_src_img = np.where(mask==255, src_img, mask)
cv2.imwrite("./procData/masked.png ", masked_src_img)
# cropping img
bb = np.asarray(bb, 'int32')
offset_x = bb[0]
offset_y = bb[1]
length_x = bb[2]
length_y = bb[3]
cv2.imwrite("./masked_crop.png ", masked_src_img[offset_y : (offset_y + length_y), offset_x : (offset_x + length_x)])
Zunächst wird das Polygon in ein Maskenbild unten konvertiert. Beachten Sie, dass andere Fehler als "int32" auftreten.
cv2.fillConvexPoly(mask, np.array(poly, 'int32'), color=(255, 255, 255))
Als nächstes müssen Sie nur angeben, dass der Teil des Maskenbildes mit dem Wert 255 den Wert "src_img" verwendet.
masked_src_img = np.where(mask==255, src_img, mask)
Wenn Sie im Begrenzungsfeld zuschneiden, können Sie schließlich einen bestimmten Bereich extrahieren.
Enjoy !
Recommended Posts