Lorsque vous utilisez le format COCO, vous souhaitez souvent extraire uniquement certains objets. À ce moment, il est nécessaire d'utiliser les informations de polygone comme masque pour extraire un objet de l'image. Même si je cherche cette méthode, je ne la trouve pas. Cette fois, je présenterai une telle méthode.
Tout d'abord, vous devriez pouvoir le voir en quelques secondes en regardant le code ci-dessous.
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)])
Tout d'abord, le polygone est converti en une image de masque ci-dessous. Notez que des erreurs autres que ʻint32` se produisent.
cv2.fillConvexPoly(mask, np.array(poly, 'int32'), color=(255, 255, 255))
Ensuite, il vous suffit de spécifier que la partie de l'image de masque avec la valeur 255 utilise la valeur de src_img
.
masked_src_img = np.where(mask==255, src_img, mask)
Enfin, si vous recadrez dans la zone de délimitation, vous pouvez extraire une zone spécifique.
Enjoy !
Recommended Posts