web-dev-qa-db-fra.com

Recadrage du polygone concave à partir de l'image à l'aide d'Opencv python

Comment recadrer un polygone concave à partir d'une image. Mon image d'entrée ressemble à this.

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.!!!

8
Himanshu Tiwari

Pas

  1. trouver une région en utilisant les points poly
  2. créer un masque en utilisant les points poly
  3. masquez-vous pour recadrer
  4. 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:

enter image description here

Résultat:

enter image description here

18
Kinght 金

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

METTRE À JOUR

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)
8
api55