Comment recadrer un polygone concave à partir d'une image. Mon image d'entrée ressemble à .
et les coordonnées du polygone fermé sont [10,150], [150,100], [300,150], [350,100], [310,20], [35,10]. Je veux que la région délimitée par un polygone concave soit recadrée en utilisant opencv. J'ai cherché d'autres questions similaires mais je n'ai pas pu trouver la bonne réponse. C'est pourquoi je te le demande? Pouvez-vous m'aider.
Toute aide serait très appréciée.!!!
Pas
- trouver une région en utilisant les points poly
- créer un masque en utilisant les points poly
- masquez-vous pour recadrer
- ajouter du blanc si nécessaire
Le code:
# 2018.01.17 20:39:17 CST
# 2018.01.17 20:50:35 CST
import numpy as np
import cv2
img = cv2.imread("test.png")
pts = np.array([[10,150],[150,100],[300,150],[350,100],[310,20],[35,10]])
## (1) Crop the bounding rect
rect = cv2.boundingRect(pts)
x,y,w,h = rect
croped = img[y:y+h, x:x+w].copy()
## (2) make mask
pts = pts - pts.min(axis=0)
mask = np.zeros(croped.shape[:2], np.uint8)
cv2.drawContours(mask, [pts], -1, (255, 255, 255), -1, cv2.LINE_AA)
## (3) do bit-op
dst = cv2.bitwise_and(croped, croped, mask=mask)
## (4) add the white background
bg = np.ones_like(croped, np.uint8)*255
cv2.bitwise_not(bg,bg, mask=mask)
dst2 = bg+ dst
cv2.imwrite("croped.png", croped)
cv2.imwrite("mask.png", mask)
cv2.imwrite("dst.png", dst)
cv2.imwrite("dst2.png", dst2)
Image source:
Résultat:
Vous pouvez le faire en 3 étapes:
1) Créez un masque à partir de l'image
mask = np.zeros((height, width))
points = np.array([[[10,150],[150,100],[300,150],[350,100],[310,20],[35,10]]])
cv2.fillPoly(mask, points, (255))
2) Appliquer le masque à l'image originale
res = cv2.bitwise_and(img,img,mask = mask)
3) En option, vous pouvez supprimer le recadrage de l'image pour en avoir une plus petite
rect = cv2.boundingRect(points) # returns (x,y,w,h) of the rect
cropped = res[rect[1]: rect[1] + rect[3], rect[0]: rect[0] + rect[2]]
Avec cela, vous devriez avoir à la fin l'image recadrée
Par souci d'exhaustivité, voici le code complet:
import numpy as np
import cv2
img = cv2.imread("test.png")
height = img.shape[0]
width = img.shape[1]
mask = np.zeros((height, width), dtype=np.uint8)
points = np.array([[[10,150],[150,100],[300,150],[350,100],[310,20],[35,10]]])
cv2.fillPoly(mask, points, (255))
res = cv2.bitwise_and(img,img,mask = mask)
rect = cv2.boundingRect(points) # returns (x,y,w,h) of the rect
cropped = res[rect[1]: rect[1] + rect[3], rect[0]: rect[0] + rect[2]]
cv2.imshow("cropped" , cropped )
cv2.imshow("same size" , res)
cv2.waitKey(0)