Bonjour à tous,
Je me permet de venir vous voir après de nombreuses recherches infructueuses sur un problème déjà connus mais auquel je n'arrive pas à trouver de solution.
Ce que mon code doit faire : Récupérer une image (portrait sur fond relativement blanc) et la détourer.
Voici comment je m'y prends :
-Je fais passer mon image en niveau de gris
-je lui applique un seuillage avec une valeur de seuil arbitraire
-j'effectue un blur sur l'image
-je fais un floodfill sur la forme afin d'avoir mon portrait remplit de noir et l'exterieur completement blanc avec erosion/dilatation (je ne suis un pur débutant en imagerie, je n'ai donc peut être pas appliqué les filtre/ouverture morphologique de la bonne manière mais le résultat correspond jusque là à ce que je recherche.
Voici le code qui répond à ceci :
Et ci-joint la fonction findCannyDraw :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 cvtColor(image, imageNB, CV_BGR2GRAY); imageNB.convertTo(imageNB, CV_8UC1); threshold(imageNB, imageNBThresholded, 160, 255, CV_THRESH_BINARY); blur( imageNBThresholded, imageNBBlured, Size(5,5)); FiltreNB=findCannyDraw(imageNBBlured);
A ce moment, j'ai donc FiltreNB qui qui est mon filtre binaire (et qui correspond au détourage que je recherche : la partie blanche est celle à détourer de mon image de base et la partie noir est la partie que je veux garder de mon image de base) et image qui est mon image de base.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Mat drawing = Mat::zeros(image.rows + 2, image.cols + 2, CV_8UC1); floodFill(image, drawing, Point(3,3), 255, 0, Scalar(), Scalar(), 4 + (255 << 8) + FLOODFILL_MASK_ONLY); Mat kernel; Point anchor(2, 2); Size ksize(5,5); kernel = getStructuringElement(MORPH_ELLIPSE, ksize, anchor); dilate(drawing, drawing, kernel); erode(drawing, drawing, kernel); // return drawing; return drawing;
Jusque la, aucun problème donc. Il ne me reste donc plus qu'a faire un ET logique entre les deux images pour ne garder de mon image de base QUE les pixels noirs correspondant de mon filtre.
J'ai donc appliqué la fonction bitwise_and après avoir fait passé mon image en monochannel (car c'est le problème qui est tout le temps remonté dans les recherches que j'ai pu effectuer) avec la fonction cvtColor.
Voici donc les lignes de code correspondant à mon && logique :
Seulement à la compilation j'ai le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 cvtColor(image, image, CV_BGR2GRAY); bitwise_and(image, FiltreNB, image);
OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array') in binary_op, file C:\opencv\sources\modules\core\src\arithm.cpp, line 1021
terminate called after throwing an instance of 'cv::Exception'
what(): C:\opencv\sources\modules\core\src\arithm.cpp:1021: error: (-209) The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function binary_op
Je serais vraiment extrêmement reconnaissant si quelqu'un ici bas était susceptible de me donner un coup de main, car je dois reconnaitre que je suis en manque d'idée après avoir bloqué plusieurs heures sur le problème ...
D'avance merci.
Cordialement,
Inso
Partager