514KBZIP
matlab doit trouver la valeur extrême de la fonction findpeak ne peut trouver qu'une valeur extrême unidimensionnelle, et opencv n'a pas de fonction correspondante, la valeur dite extrême est plus grande que les valeurs environnantes, et ensuite voir quel degré de demande pour la valeur extrême : pour l'adhésion de la cible, j'utilise cette méthode de valeur extrême pour trouver la valeur extrême et ensuite + segmentation de la ligne de partage des eaux, l'effet est meilleur que les méthodes de segmentation que j'ai essayées auparavant, mais aussi simple et moins de temps.
Mat dist_image,eachpeaks,peaksshow.
distanceTransform(bwimg,dist_image, DIST_L2, 3) ;
vecteur<Point> pics.
findPeaks(dist_image,lengthresh,peaks,eachpeaks).
Mat imglabels,segresult.
watershedSegmentProc(bwimg,eachpeaks,peaksshow,imglabels,segresult) ;
Tous les points de la zone centrale trouvés de cette manière sont plus précis et il y a moins de sur-segmentation lorsque le bassin versant est divisé.
Cependant, cette approche devrait être optimisée un peu plus, car les pôles trouvés de cette manière ne sont pas favorables à un grand objectif unique, qui trouvera plusieurs pôles. Quant au code optimisé, je ne le publierai pas (usage interne à l'entreprise).
Un point d'interrogation : lors du débogage d'aujourd'hui, comment se fait-il que les résultats des bassins versants aient encore des zones inconnues non assignées :
Il est surprenant de constater qu'il y a des valeurs dans la région 0-inconnu ici, ce qui est clairement le résultat après que le bassin versant a déjà été créé :
/* Traitement de la division du bassin versant
* srcmatbw-------- carte binaire Canal unique
* everycenters---- carte centrale des pierres divisibles avec le noir 0 en arrière-plan et le point blanc 255 au centre
* imglabels------- résultat du bassin versant le fond est 100, la ligne de division est -1, les pierres divisibles sont 1~N (peut avoir 0 déjà toléré)
* */
int watershedSegmentProc(Mat &srcmatbw,Mat &everycenters,Mat &imglabels)
{
// int not_zero_count=countNonZero(srcmatbw) ;
// float white_count_thre=srcmatbw.rows*srcmatbw.cols ;
// white_count_thre*=0.8 ;
// if((not_zero_count(int)white_count_thre))
// {
// retour 2 ;
// }
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(11, 11)) ;
Mat element2 = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)) ;
Mat binary_dilate.//Tous les centres
dilate(everycenters, binary_dilate, element2, Point(-1, -1), 1) ;
Mat binary_8UC3.
vector resultmats.
resultmats.push_back(srcmatbw) ;
resultmats.push_back(srcmatbw) ; resultmats.push_back(srcmatbw).
resultmats.push_back(srcmatbw) ; resultmats.push_back(srcmatbw).
merge(resultmats,binary_8UC3) ;
Mat inconnu.//Obtenir la surface inconnue, c'est-à-dire la surface concernée par la délimitation de la ligne de partage des eaux.
bitwise_xor(srcmatbw,binary_dilate,unknown).
/Fusionner les images des marqueurs
Mat imgstats, imgcentroid.
connectedComponentsWithStats(binary_dilate, imglabels, imgstats, imgcentroid) ; //Marqueurs de champ de connectivité
imglabels.convertTo(imglabels, CV_32SC1) ; // Conversion du type d'image
imglabels = imglabels + 100;/La zone d'arrière-plan est de 100 pixels
pour (int i=0;i<rangées inconnues;i++)
{
uchar* ptr = unknown.ptr(i) ;
pour (int j=0;j<colonnesinconnues;j++)
{
si (255==ptr[j])
{
imglabels.at(i, j) = 0; // Les pixels de la zone inconnue sont à 0
}
}
}
//Segmentation des bassins versants
watershed(binary_8UC3, imglabels).
}
Qu'est-ce qui se passe avec ce 0 que je ne connais pas ?
/**********************************************************************/
En ce qui concerne l'appel par opencv 4.1 de modèles .pb entraînés par tensorflow avec des nœuds DropOut ou BatchNorm, un nouveau collègue m'a dit qu'opencv c++ ne le supportait pas, j'ai vérifié :
Exporter un graphe tensorflow avec batchnorm vers opencv dnn - OpenCV Q&A Forum
OpenCV : modules/dnn/src/tensorflow/tf_importer.cpp | Fossies
Comment charger un modèle Keras construit avec le backend tensorflow dans OpenCV - OpenCV Q&A Forum
C++ et le nœud phase_train - Sujet #357 - davidsandberg/facenet - GitHub
J'ai vérifié le code source de opencv4.1, et j'ai vu que l'interface fushBatchNorm est écrite, si elle n'est pas supportée, alors opencv a écrit cette interface, ce n'est pas des côtes de poulet :
Vous voyez, il reconnaît ce nœud. Je pense que c'est juste la façon dont opencv c++ spécifie avant de charger le modèle formé sous python.
En ce qui concerne le nœud d'abandon, je ne le vois pas dans le code source d'opencv pour le moment, mais j'ai vu des solutions évoquées en ligne :
Un autre a même écrit le code pour entraîner le modèle avec des nœuds de perte sous python et ensuite des appels opencv c++.
Je ne pense donc pas qu'ils ne soient pas supportés, opencv c++ est juste un peu plus strict que sous python, et il chargera selon ses règles, nous sommes juste encore en train de les comprendre.
Aujourd'hui, j'ai trouvé des informations très utiles sur la segmentation d'images sur le mur, mais malheureusement il n'y a pas de code correspondant, il y en a un particulièrement bon qui parle de la segmentation de cibles irrégulières se chevauchant par correspondance de forme ou ajustement.
J'espère avoir le temps de le mettre en œuvre dans le cadre d'un autre projet. Voici le résultat de la thèse : j'ai l'impression qu'il fonctionne mieux pour les diagrammes qui se chevauchent beaucoup et qui ne sont pas au centre de l'attention !
Déclaration de ressources (l'achat est considéré comme un accord avec cette déclaration) : 1) Toute opération sur la plate-forme du site web est considérée comme ayant lu et accepté le bas de l'accord d'enregistrement du site web et la clause de non-responsabilité, les ressources de ce site ont été vendues à un prix très bas et ne fournissent pas d'assistance technique. 2) Certains utilisateurs du réseau partagent l'adresse du disque net qui peut être invalide, par exemple en cas de défaillance, veuillez envoyer un courriel au service clientèle code711cn#qq.com (remplacez # par @) sera fait pour envoyer. 3) Ce site fournit toutes les ressources téléchargeables (logiciels, etc.) pour s'assurer qu'il n'y a pas de changements négatifs ; mais ce site ne peut pas garantir l'exactitude, la sécurité et l'intégrité des ressources, l'utilisateur télécharge à sa propre discrétion, nous communiquons pour apprendre dans le but de ne pas tout le code source n'est pas 100% sans erreur ou pas de bugs ; vous devez avoir une certaine base pour être en mesure de lire et de comprendre le code, pour être en mesure de modifier le code de débogage ! et de résoudre les erreurs. En même temps, les utilisateurs de ce site doivent comprendre que le Source Code Convenience Store ne possède aucun droit sur le logiciel fourni pour le téléchargement, le copyright appartient au propriétaire légal de la ressource. 4. toutes les ressources sur ce site uniquement à des fins d'apprentissage et de recherche, s'il vous plaît doivent être supprimées dans les 24 heures des ressources téléchargées, ne pas utiliser à des fins commerciales, sinon les litiges juridiques découlant du site et de l'éditeur de la responsabilité collatérale du site et ne seront pas pris en charge ! 5. en raison de la nature reproductible des ressources, une fois achetées, les ressources ne sont pas remboursables et le solde de la recharge ne l'est pas non plus.