2017-10-09 5 views
2

Je suis en train de convertir un code opencv de C++ en python et bloqué quelque part près de floodfill.Convertir floodfill ouvrir cv de C++ en python

Le C++ implemenation est

Mat floodFilled = cv::Mat::zeros(dilateGrad.rows+2, dilateGrad.cols+2, CV_8U); 
floodFill(dilateGrad, floodFilled, cv::Point(0, 0), 0, 0, cv::Scalar(), cv::Scalar(), 4 + (255 << 8) + cv::FLOODFILL_MASK_ONLY); 
floodFilled = cv::Scalar::all(255) - floodFilled; 
Mat temp; 
floodFilled(Rect(1, 1, dilateGrad.cols-2, dilateGrad.rows-2)).copyTo(temp); 

Mon implémentation python

h, w = dilateGrad.shape[:2] 
floodFilled =np.zeros((h+2,w+2),dtype = np.uint8) 
cv2.floodFill(dilateGrad,floodFilled,(0,0),255,cv2.FLOODFILL_MASK_ONLY) 
floodFilled = np.all(255) - floodFilled 
floodFilled = cv2.rectangle(dilateGrad,1,1,(h-2,w-2),floodFilled,cv2.CV_8U) 

Je suis nouveau à OpenCV en python, l'aide de personne est appréciée.

+0

Quel est le problème? – GPPK

+0

@GPPK je ne suis pas capable de décoder la dernière partie de l'inondation i.e créer une valeur scalaire pour le remplissage et comment le rectangle est créé –

Répondre

1

L'opérateur Rect dans la dernière ligne du code C++ est utilisé pour spécifier la ROI de floodFilled Mat et copier cette ROI sur Mat temp.

Un comportement similaire peut être réalisé dans le code python comme suit:

temp = floodFilled[1:h-2, 1:w-2].copy() 

En ce qui concerne l'opérateur Scalar, vous devez utiliser le tuple de python en place de Scalar. comme Scalar::all(255) sera égal à tuple([255] * NumberOfChannels). Pour votre cas actuel, le NumberOfChannels est , il sera donc équivalent à seulement .

Au lieu de Scalar() vide, il suffit de passer None comme argument.

Votre code final peut ressembler à ceci:

h, w = dilateGrad.shape[:2] 
floodFilled = np.zeros((h+2,w+2), dtype = np.uint8) 
cv2.floodFill(dilateGrad, floodFilled, (0,0), 255, None, None, cv2.FLOODFILL_MASK_ONLY) 
floodFilled = (255) - floodFilled 
temp = floodFilled[1:h-2, 1:w-2].copy() 

Juste pour info:

Le but de cv2.rectangle fonction est de dessiner un rectangle sur l'image.

np.all évalue la liste des conditions binaires qui lui sont transmis comme argument et retourne vrai que si tous les des conditions dans la liste la valeur True.

+0

merci pour l'info mais comment puis-je utiliser la fonction scalaire de C++ en python. Et je ne peux pas obtenir mon cv2.floodfill correctement car je reçois une image noire complète. –

+0

@faizanbaig ... Veuillez vérifier la réponse mise à jour. – sgarizvi

+0

Merci correctement expliqué –