Appliquer le Masque à l'image OpenCV?
J'ai un masque binaire que je veux être appliquées en permanence, pour une image en couleurs comment puis-je faire?
Le masque binaire doit être de préférence permanente - comme je ne veux pas appliquer le masque à l'image chaque fois que j'appelle une fonction.
De base Exemples de Code serait appréciée. Si vous utilisez le code, veuillez expliquer le code au lieu de simplement poster.
Merci
OriginalL'auteur fdh | 2011-09-20
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas d'appliquer un masque binaire d'une image. Vous (facultatif) utilisez un masque binaire dans une fonction de traitement d'appel pour le dire à la fonction des pixels de l'image que vous souhaitez traiter. Si je suis complètement à la mauvaise interprétation de votre question, vous devez ajouter plus de détails à préciser.
Je pense que cela s'applique par exemple à détection de fonctionnalité fonctions comme TAMISER ou de SURF.
OriginalL'auteur SSteve
Tandis que @perrejba s réponse est correcte, il utilise l'héritage de style C fonctions. Comme la question est marqué, C++, vous pouvez utiliser une méthode plutôt:
inputMat.copyTo(outputMat, maskMat);
Tous les objets sont de type
cv::Mat
.S'il vous plaît être conscient que le masquage est binaire. Toute valeur non nulle dans le masque est interprété comme "ne copie". Même si le masque est une image en niveaux de gris.
Aussi être conscient que l' .copyTo() la fonction n'est pas clair à la sortie avant de la copie.
Si vous voulez modifier de façon permanente l'Image d'origine, vous devez faire une copie supplémentaire/clone/cession. Le copyTo() la fonction n'est pas définie pour le chevauchement d'entrée/de sortie des images. Si vous ne pouvez pas utiliser la même image à la fois d'entrée et de sortie.
copyTo
est pas défini uniquement pour les images qui se chevauchent partiellement de sorte que vous devriez être en mesure de l'utiliser pour appliquer le masque sans créer une nouvelle matrice. À partir de docs.opencv.org/modules/core/doc/... : "Alors que m.copyTo(m); fonctionne parfaitement, la fonction ne gère pas le cas d'un chevauchement partiel entre la source et la destination des matrices."Cependant, il est juste de se produire pour moi que parce que copyTo n'est pas évident de valeurs où le masque est non-nul, en l'utilisant comme
m.copyTo(m, mask)
ne fera absolument rien. Alors, toutes mes excuses, vous avez raison. Vous avez besoin de créer une nouvelle matrice.OriginalL'auteur Chaos_99
Vous pouvez utiliser le masque pour ne copier que la région d'intérêt de l'image d'origine à une destination:
où
mask
doit être un 8-bits de canal unique tableau.Voir plus à la OpenCV docs
Vous avez juste besoin d'image.copyTo(dst, masque);
Cette fonction ne fonctionne pas mieux pour moi. Dans mon cas, les Deux images ont été 8UC1 mais après masquage j'ai été faire un peu bizarre de sortie avec quelques lignes. J'ai utilisé
for(int row = 0; row < imgSrc.rows; row++) { for(int col = 0; col < imgSrc.cols; col++) { uchar pixel = imgMask.at<uchar>(row, col); if(pixel == 0) { imgSrc.at<uchar>(row, col) = pixel; } } }
et j'ai eu les résultats escomptésOriginalL'auteur volpato
Bien, cette question apparaît en haut des résultats de recherche, je crois donc que nous avons besoin de l'exemple de code ici. Voici le code Python:
Masque et le cadre doit être de la même taille, de sorte que les pixels restent tel quel masque est
1
et sont remis à zéro lorsque le masque de pixels est0
.Et pour
C++
c'est un peu différent:OriginalL'auteur rudyryk
Voici un peu de code pour appliquer le masque binaire sur une vidéo d'une séquence d'images acquises à partir d'une webcam.
commentaire et décommentez la "bitwise_not(Mon_mask,Mon_mask);"ligne et de voir l'effet.
records,
Ahmed.
OriginalL'auteur Ahmed